Python IOError: [Errno 22] при создании файла - PullRequest
0 голосов
/ 12 декабря 2018

Справочная информация: я использую cx_Freeze для компиляции большой программы в EXE.EXE работает на моем компьютере, но не будет работать на любом другом компьютере.

Я считаю, что я выделил проблему в процесс создания файла в программе.Ниже приведен упрощенный пример того, что я пытаюсь запустить:

file_name = '%s\\%s.txt' % (os.getcwd(), 5)

with open(file_name, 'wb') as f:
    # do something

Опять же, это успешно создает файл на моем компьютере, однако на всех других машинах, которые я тестировал, возникает следующая ошибка:

IOError: [Errno 22] invalid mode <'wb'> or filename: 'C:\\Users\\John G\\5.txt'

Первоначально я думал, что двойная косая черта (\) в пути к файлу является основной причиной, но я больше не верю, что это проблема, потому что когда я print file_name на другом компьютере, вывод нормальный: C:\Users\John G\5.txt

Может кто-нибудь объяснить, почему этот код успешно работает на моей машине, но не работает на других машинах?Все машины работают под управлением Windows 10. На одном был установлен Python, а на другом - нет. Обе ошибки.

РЕДАКТИРОВАТЬ: полный код приведен ниже.Ошибка ввода-вывода происходит в with open(name_text) as f:

def main(file_path):
    with open(file_path, 'rb') as pdf_file:
        pdf_buffer = StringIO(pdf_file.read())

    try:
        input_pdf = pyPdf.PdfFileReader(pdf_buffer)
    except:
        input_pdf = pyPdf.PdfFileReader(decompress_pdf(pdf_buffer))

    no_of_pages = input_pdf.getNumPages()

    headers = []
    row_list = []
    text = []
    count = 0

    for i in range(no_of_pages):
        writer = pyPdf.PdfFileWriter()
        page = input_pdf.getPage(i)
        writer.addPage(page)
        file_name = '%s\\%s.pdf' % (os.getcwd(), count)
        newFile = open(file_name,'wb')
        writer.write(newFile)
        newFile.close()
        count += 1

        try:
            process = subprocess.call(['pdftotext', '-layout', file_name])
        except:
            print 'fail'

        name_text = re.sub('.pdf$','.txt',file_name)
        with open(name_text) as f:
            for line in f:
                line = line.decode('ascii','ignore').replace('\n','').replace(',','').replace(';','').strip()
                if line != '':
                    text.append(line)
        os.remove(name_text)
        os.remove(file_name)


        details_start = ''
        details_end = ''
        details_dict = {}

        attribute_start = ''

        details_bool = True
        attributes_bool = False

        for x,y in enumerate(text):
            if 'DATABASE' in y:
                details_start = int(x +1)
            if 'PostingBody' in y:
                details_end = int(x)
                #print details_end
            if 'Attributes' in y:
                attribute_start = int(x)
                attributes_bool = True

        renewal_dates = []

        for x in range(details_start, details_end):
            if 'posting_renewal_dates' in text[x]:
                n = 0
                #print text[x].split(':')[1].strip()
                if text[x].split(':')[1].strip() != 'n/a':
                    testbool = True
                    while testbool:
                        if not 'record_modified:' in text[x+n]:
                            if 'posting_renewal_dates:' in text[x+n]:
                                renewal_dates.append( text[x+n].split(': ')[1] )
                            else:
                                renewal_dates.append( text[x+n] )
                            n += 1
                        else:
                            testbool = False
            elif not text[x][0].isupper():
                #print text[x]
                key = text[x].split(':')[0]
                value = text[x].split(':')[1]



            if key != '':
                details_dict[key] = value

        try:
            xObject = page['/Resources']['/XObject'].getObject()
            for obj in xObject:
                if xObject[obj]['/Subtype'] == '/Image':
                    size = (xObject[obj]['/Width'], xObject[obj]['/Height'])
                    data = xObject[obj].getData()

                    mode = "RGB"
                    try:
                        if not os.path.exists('%s/%s' % (new_folder, details_dict['posting_id'])):
                            os.mkdir('%s/%s' % (new_folder, details_dict['posting_id'].strip(' ')))
                            img_dir = '%s/%s' % (new_folder, details_dict['posting_id'].strip(' '))
                            print 'Success -- ' + img_dir
                        else:
                            print "Directory already exists"
                    except:
                        print 'Directory %s already exists' % details_dict['posting_id']
                    #print xObject[obj]['/Filter']
                    #print xObject[obj]['/ColorSpace']
                    if xObject[obj]['/Filter'] == '/FlateDecode':
                        img = Image.frombytes(mode, size, data)
                        img.save(img_dir + '\\' + obj[1:] + ".jpg")
                    elif xObject[obj]['/Filter'] == '/DCTDecode':
                        img = open(obj[1:] + ".jpg", "wb")
                        img.write(data)
                        img.close()
                    elif xObject[obj]['/Filter'] == '/JPXDecode':
                        img = open(obj[1:] + ".jp2", "wb")
                        img.write(data)
                        img.close()
        except:
            print 'No images found for %s' % details_dict['posting_id']


        body = ''
        if attributes_bool:
            for x in range(details_end+2, attribute_start):
                body += text[x] + ' '
        else:
            for x in range(details_end+2, len(text)-1):
                body += text[x] + ' '

        attributes_dict = {}
        if attributes_bool:
            for x in range(attribute_start+2, len(text)-1):
                try:
                    key = text[x].split(':')[0]
                    value = text[x].split(':')[1]
                except:
                    pass

            attributes_dict[key] = value

        row = []

        for x in details_dict:
            if not x in headers:
                headers.append(x)
            row.append(details_dict[x])

        if not 'body' in headers:
            headers.append('body')
        row.append(body)

        row_list.append(row)

    with open(filename, 'wb') as f:
        csvwriter = csv.writer(f)
        csvwriter.writerow(headers)
        for x in row_list:
            csvwriter.writerow(x)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...