【问题标题】:Read data from text files having same name structure and append all data into a new file从具有相同名称结构的文本文件中读取数据并将所有数据附加到新文件中
【发布时间】:2017-10-16 08:51:42
【问题描述】:

我有一些数据文件,比如data1.txtdata 2.txt、...等等。我想使用单个循环结构读取所有这些数据文件并将数据值附加到单个文件中,例如 data-all.txt。

我可以使用以下任何一种编程语言:cpythonmatlab

【问题讨论】:

  • 你有你的代码原型吗?提供文件的更多详细信息。这些文件的结构是什么?它们是制表符还是逗号分隔?如果是这种情况,我建议您阅读 csv 模块 (docs.python.org/3/library/csv.html)。
  • @Felipe 所有数据文件均为.txt 格式。有 M 行和 3 列,只有数值,没有文本(甚至没有标题)。数值以制表符分隔。

标签: python c matlab loops append


【解决方案1】:

pathlib 模块非常适合查找匹配文件,并且易于读/写:

from pathlib import Path

def all_files(dir, mask):
    for path in Path(dir).glob(mask):
        yield from path.open()

Path('data_all.txt').write_text(''.join(all_files('.', 'data*.txt')))

【讨论】:

  • 名称与通配符字符串匹配的文件。
  • 天哪,多么棒的模块!感谢您的提示!
  • 这个性感的 '/' 运算符重载怎么样? dir_path = Path('/tmp/some/dir'); file_in_dir = dir_path / 'data1.txt' 还有用于递归 glob 的 rglob
  • 运行此代码时出现以下错误:SyntaxError: Invalid syntax 第 5 行,即 yield from path.open()
  • yield from 相当新,我认为 Python 3.5。将其替换为for line in path.open(): yield line
【解决方案2】:

在 python 中首先你必须创建所有文件路径的列表,你可以在 python 中使用 glob 库。

import glob
import pandas as pd
path_list = glob.glob('Path/To/Your/DataFolder/pattern(data*)')

然后您可以使用列表理解读取该数据。它会根据您文件夹中的数据文件为您提供数据框列表

list_data = [pd.read_csv(x,sep='\t') for x in path_list]

它将数据合并到单个数据帧中,您可以将其写入单个数据帧。

data_all = pd.concat(list_data,ignore_index=True)

现在您可以将数据框写入单个文件。

data_all.to_csv('Path',sep=',')

【讨论】:

    【解决方案3】:

    使用 python zipcsv 模块来实现这一点。在单个 for 循环中:

    例如:

    import csv
    with open("data_all.csv", "w") as f:
        csv_writer = csv.writer(f)
        for d1, d2, d3 in zip(open("data1.txt", "r"), open("data2.txt", "r"), open("data3.txt", "r")):
            csv_writer.writerow([d1, d2, d3])
    

    【讨论】:

      【解决方案4】:

      可以通过读取每个文件的内容,并将它们写入输出文件句柄来完成。您描述中的文件结构包含数字,因此我们可能需要在开始阅读之前调用 sorted 对它们进行排序。 “files_search_pattern”应该指向输入目录“PATH/*.txt”,输出文件句柄“data-all.txt”也是如此

      import glob
      
      files_search_pattern = "*.txt"
      
      files = sorted(glob.glob(files_search_pattern))
      
      with open("data-all.txt", "wb") as output:
          for f in files:
              with open(f, "rb") as inputFile:
                  output.write(inputFile.read())
      

      【讨论】:

        【解决方案5】:

        在 Windows 中,使用 复制data*.txt data-all.txt

        在 Unix 中,使用 cat data*.txt >> data-all.txt

        【讨论】:

          猜你喜欢
          • 2017-02-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-12-13
          • 2019-12-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多