【问题标题】:Python File ConcatenationPython 文件连接
【发布时间】:2011-07-26 14:38:28
【问题描述】:

我有一个数据文件夹,其中包含通过程序运行的每个主题的子文件夹。因此,例如,在数据文件夹中,有 Bob、Fred 和 Tom 的文件夹。这些文件夹中的每一个都包含各种文件和子文件夹。但是,我只对每个主题文件夹中包含的“summary.log”文件感兴趣。

我想将 Bob、Fred 和 Tom 的“summary.log”文件连接到数据文件夹中的单个日志文件中。此外,我想在每个日志文件中添加一列,列出主题编号。

这可以在 Python 中实现吗?或者有更简单的方法吗?我尝试了许多不同批次的代码,但没有一个能完成工作。例如,

#!/usr/bin/python

import sys, string, glob, os

fls = glob.glob(r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*');
outfile = open('summary.log','w');
for x in fls:
         file=open(x,'r');
         data=file.read();
         file.close();
         outfile.write(data);
outfile.close();

给我错误,

Traceback (most recent call last):
  File "fileconcat.py", line 8, in <module>
    file=open(x,'r');
IOError: [Errno 21] Is a directory

我认为这与数据文件夹包含子文件夹的事实有关,但我不知道如何解决它。我也试过这个,但无济于事:

from glob import iglob
import shutil
import os

PATH = r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*'

destination = open('summary.log', 'wb')
for filename in iglob(os.path.join(PATH, '*.log'))
    shutil.copyfileobj(open(filename, 'rb'), destination)
destination.close()

这会在“for filename”行出现“无效语法”错误,但我不确定要更改什么。

【问题讨论】:

    标签: python file logging concatenation


    【解决方案1】:

    语法与 glob 的使用无关。 您忘记了 for 语句末尾的“:”:

    for filename in iglob(os.path.join(PATH, '*.log')):
                                                      ^--- missing
    

    但以下模式有效:

    PATH = r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*/*.log'
    
    destination = open('summary.log', 'wb')
    for filename in iglob(PATH):
        shutil.copyfileobj(open(filename, 'rb'), destination)
    destination.close()
    

    【讨论】:

      【解决方案2】:

      for 行中缺少冒号 (:)。 此外,您应该使用with,因为它处理关闭文件(您的代码不是异常安全的)。

      from glob import iglob
      import shutil
      import os
      
      PATH = r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*'
      
      with open('summary.log', 'wb') as destination:
          for filename in iglob(os.path.join(PATH, '*.log')):
              with open(filename, 'rb') as in_:
                  shutil.copyfileobj(in_, destination)
      

      【讨论】:

        【解决方案3】:

        在你的第一个例子中:

        import sys, string, glob, os
        

        您没有使用sysstringos,因此无需导入它们。

        fls = glob.glob(r'/Users/slevclab/Desktop/Acceptability Judgement Task/data/*');
        

        在这里,您正在选择主题文件夹。由于您对这些文件夹中的summary.log 文件感兴趣,您可以按如下方式更改模式:

        fls = glob.glob('/Users/slevclab/Desktop/Acceptability Judgement Task/data/*/summary.log')
        

        在 Python 中,不需要以分号结束行。

        outfile = open('summary.log','w')
        for x in fls:
             file = open(x, 'r')
             data = file.read()
             file.close()
             outfile.write(data)
        outfile.close()
        

        【讨论】:

          【解决方案4】:

          正如VGE's answer 所示,一旦您修复了语法错误,您的第二个解决方案就可以工作。但请注意,更通用的解决方案是使用os.walk

          >>> import os
          >>> for i in os.walk('foo'):
          ...     print i
          ... 
          ('foo', ['bar', 'baz'], ['oof.txt'])
          ('foo/bar', [], ['rab.txt'])
          ('foo/baz', [], ['zab.txt'])
          

          这将遍历开始目录上方树中的所有目录,并在目录和文件之间保持良好的分离。

          【讨论】:

            猜你喜欢
            • 2018-10-31
            • 2018-06-14
            • 1970-01-01
            • 2022-11-17
            • 1970-01-01
            • 2010-11-03
            • 1970-01-01
            • 2012-11-16
            • 2023-03-03
            相关资源
            最近更新 更多