【问题标题】:Iterating and modifying files in a directory迭代和修改目录中的文件
【发布时间】:2020-05-02 00:52:59
【问题描述】:

我已经有代码可以修改与我的程序位于同一目录中的一个 .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',尽管它会打印文件名.. 我做错了什么?

有人可以帮忙吗?

【问题讨论】:

    标签: python directory edi contextmanager


    【解决方案1】:

    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
    

    【讨论】:

    • 感谢您的帮助,虽然现在我得到了[Errno 2] No such file or directory: 'C:\\Users\\name\\test_edi_dirtestedifact - Kopie (10).edi' .. 为什么将目录名与我的文件名结合在一起?我尝试添加一个空格,但我无法将它们分开......有什么想法吗?
    • 路径末尾缺少/(在我的代码中)。
    【解决方案2】:

    这是因为当您调用 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)
    

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 2018-09-01
        • 2021-03-27
        • 2012-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-22
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多