【问题标题】:Merging text files horizontally水平合并文本文件
【发布时间】:2017-08-01 17:24:10
【问题描述】:

所以我有 20 个 txt 文件。 10个

A_1,A_2......A_10

另外10个是

B_1,B_2.....B_3......B_10

所以,基本上,我正在尝试水平合并A_1B_1A_2B_2........、A_10B_10(这意味着如果有 4 AB 中的每个列,我希望输出为 8)。我还想保存这 10 个合并文件。我真的是 Python 新手,所以不知道该怎么做。

import numpy as np
filelist=[]
filelist1=[]
for i in range(1,11):
    filelist.append("/Users/Hrihaan/Desktop/A_%s.txt" %i)
for j in range(1,11):
    filelist1.append("/Users/Hrihaan/Desktop/B_%s.txt" %j)

【问题讨论】:

  • append 添加到末尾。您想从 a_1 和 b_1 中读取第 1 行。然后合并这些行,newline = aLine + bLine 然后将新行写入新文件。然后继续逐行读取、组合并写入新文件。您至少应该尝试读取文件并写入新文件。您发布的代码勉强算作一次尝试。
  • 替代方式:您可以将它们读取到带有熊猫的数据帧并使用 df concat:pandas.pydata.org/pandas-docs/stable/generated/…
  • 你能显示任何文件的前几行吗?如果要使用numpy,则必须将它们读入数组,格式很重要。
  • 我尝试了一些代码,但它们不起作用,所以我只发布了我创建两个文件列表的部分代码,我很抱歉@Jacobr365

标签: python numpy text merge


【解决方案1】:

使用 pandas 可以轻松解决您的问题。下面这段代码会读取文件 A_1 - A_10 和 B_1 - B_10 ,然后水平追加各自的文件,最终得到10个数据帧。

import pandas

dataFrames_A = []
dataFrames_B = []

# file count of each type A or B
fileCount = 10

for i in range(1,fileCount+1):
    fileName_A = 'C:/Users/Hrihaan/Desktop/A_' + str(i) + '.txt'
    fileName_B = 'C:/Users/Hrihaan/Desktop/B_' + str(i) + '.txt'

    dataFrames_A.append(pandas.read_csv(fileName_A, sep='\t', encoding='utf-8'))
    dataFrames_B.append(pandas.read_csv(fileName_B, sep='\t', encoding='utf-8'))

mergedDataFrames = []
for i in range(0,fileCount):
    mergedDataFrames.append(pandas.concat([dataFrames_A[i], dataFrames_B[i]], axis=1))

for i, dataFrame in enumerate(mergedDataFrames):
    fileName = 'C:/Users/Hrihaan/Desktop/A_B_' + str(i+1) + '.txt'
    dataFrame.to_csv(fileName, sep='\t', encoding='utf-8')

【讨论】:

  • 嗨 Anoop,感谢您的建议,我不需要指定文件的路径吗?合并的 10 个文件将保存在哪里?我也在尝试以 txt 格式输出。
  • 这是假设你的脚本和输入的txt文件在同一个目录下。您的输出文件也将保存在同一目录中。您始终可以在任何您认为需要的地方提供路径信息。最后,输出文件存储为 .txt,正如您在最后一个 for 循环中的变量 fileName 中看到的那样,分隔符也是 '\t'
  • 我尝试按照您的说明进行操作,得到了这两个错误,1:在 for i in range(1,fileCount+1) 之后出现这个错误:(文件 b'A_1.txt' 不存在)和2:mergedDataFrames = [] 后错误:(列表索引超出范围)。我的文件路径是:C:\Users\Hrihaan\Desktop,非常感谢您的帮助。
  • 你能在你的问题中发布你正在执行的代码吗?还有你的文件名和完整路径?
  • 嗨 Anoop,这是完整路径>>C:\Users\Hrihaan\Desktop\A_1.txt 和 C:\Users\Hrihaan\Desktop\B_1.txt,对于我使用它的代码按照您的指示。
【解决方案2】:

对于一对文件,首先将文件 A 的内容拆分为行数组(由换行符 '\n' 字符拆分),对文件 B 执行相同操作。

然后,对于文件 B 的每一行,将该行附加到 A 的相应行。如果文件 A 的行数与文件 B 的行数不同,只需用空字符串填充较短的数组的其余部分,直到它们具有相同的行数(因此您将有 something 连接与相应的行)。

最后,用 '\n' 字符连接文件 A 的行(现在是两个文件行的连接),并对文件 B 执行相同操作。

【讨论】:

    【解决方案3】:

    如果您只想合并行而不考虑内容,则不需要

    import os
    
    def path(dirname, letter, index): # build the absolute path of a single file
        return os.path.join(dirname, '{}_{}.txt'.format(letter, index))
    
    d = 'C:/Users/Hrihaan/Desktop'
    for i in range(1, 11):
        with open(path(d, 'C', i), 'w') as fout, open(
               path(d, 'A', i)) as fa, open(path(d, 'B', i)) as fb:
             for line_a, line_b in zip(fa, fb):
                 fout.write(line_a.rstrip('\n') + line_b)
    

    这不会在两者之间插入任何分隔符,如果这些是制表符或逗号分隔的文件,您将需要它。您可以在代码的最后一行添加适当的分隔符,例如:

    fout.write(line_a.rstrip('\n') + ' ' + line_b)
    

    或者,您可以使用其他涉及文件实际解析的方法。

    【讨论】:

    • 感谢您的帮助回复,我试过了,但没有找到我猜的文件,错误:(FileNotFoundError: [Errno 2] No such file or directory: 'A_1')。
    • @Hrihaan 我忘记了.txt(正在查看您的问题而不是您的代码)。现在修好了。
    • @Hrihaan 进行了另一次编辑以更轻松地使用完整路径。
    • 嗨,该代码的工作原理就像一个魅力,谢谢,您能否建议我如何将 SPACE 作为分隔符? @Lev
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 2011-03-29
    • 2022-12-18
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多