迭代和修改目录中的文件

Iterating and modifying files in a directory

我已经有代码可以修改与我的程序位于同一目录中的一个 .edi 文件 (testedifact.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'。我做错了什么?

有人可以帮忙吗?

发生这种情况是因为当您调用 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)

看来您必须传递整个图像路径:

with open('C:\Users\name\test_edi_dir\' + file, 'r') as edifactile:
    pass

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