Итерация и изменение файлов в каталоге - PullRequest
1 голос
/ 15 января 2020

У меня уже есть код, который работает для изменения одного .edi-файла (testifact.edi) в том же каталоге, что и моя программа. однако мне нужно запустить мой сценарий для папки, содержащей много этих файлов .edi, поэтому я в основном хочу использовать свой код, который будет применен к каждому отдельному файлу

, вот что у меня работает с одним файлом:

segmentsNew = []
global segments     
with open( "testedifact.edi" , "r+") as edifactile:
    segments = edifactile.readlines()
    versionNumber = getVersionNumber(segments)
    for segment in segments:
        #do stuffs
edifactile.close()
with open ("testedifact.edi" , "w") as edifactfile:
    edifactile.writelines(segmentsNew)
edifactfile.close()

но я хочу сделать это для файлов за пределами этого каталога, а также для наших сетевых дисков.

Я попытался перебирать файлы в моем каталоге (как небольшой тест) и передача каждого файла в «with open..», например,

directory = os.listdir(r'C:\Users\name\test_edi_dir')
for file in directory:
    print("printing file names:", file)
    with  open(file, 'r') as edifactfile:
        pass

print(edifactfile.closed)

, и я продолжаю получать FileNotFoundError: [Errno 2] No such file or directory: 'testedifact - Kopie (10).edi', хотя он печатает имя файла .. что я делаю неправильно?

может кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

1 голос
/ 15 января 2020

Похоже, вы должны пройти весь путь изображения:

with open('C:\Users\name\test_edi_dir\' + file, 'r') as edifactile:
    pass
1 голос
/ 15 января 2020

file содержит только имя файла, а не путь, в котором он хранится. Вы также должны передать это.

path = r'C:\Users\name\test_edi_dir/'
directory = os.listdir(path)

for file in directory:
    print("printing file names:", file)
    with open(path+file, 'r') as edifactile:
        pass
1 голос
/ 15 января 2020

Это происходит потому, что когда вы вызываете open(file, 'r'), он пытается открыть файл в текущем рабочем каталоге.

Измените ваш код следующим образом:

directory = os.listdir(r'C:\Users\name\test_edi_dir')
for file in directory:
    print("printing file names:", file)
    with  open('C:\Users\name\test_edi_dir\' + file, 'r') as edifactile:
        pass

    print(edifactfile.closed)

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

traceback (most recent call last):
  File "<stdin>", line 3, in <module>
IOError: [Errno 21] Is a directory: '...'

Итак, вы хотите проверить, является ли файл файлом перед открытием:

isFile = os.path.isfile('C:\Users\name\test_edi_dir\' + file)

И, наконец, полный код:

directory = os.listdir(r'C:\Users\name\test_edi_dir')
for file in directory:
    print("printing file names:", file)
    full_filename = 'C:\Users\name\test_edi_dir\' + file
    if os.path.isdir(full_filename):
         continue
    with  open(full_filename, 'r') as edifactile:
        pass

    print(edifactfile.closed)
...