2017-08-01 49 views
0

所以我有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水平(这意味着如果在AB中各有4列,我希望输出具有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) 
+0

append增加到最后。你想从a_1和b_1的第1行读取。然后结合这些行,'newline = aLine + bLine',然后将新行写入新文件。然后,继续阅读,结合,并写入一个新的文件。您至少应该尝试阅读文件并写入新文件。您发布的代码很难算作尝试。 – Jacobr365

+0

另一种方式:你可以阅读他们的数据框与熊猫和使用df concat:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.concat.html –

+0

你可以显示前几行任何的文件?如果你想使用numpy,那么它们必须被读入数组,并且格式很重要。 –

回答

1

您的问题可以很容易地用熊猫来解决。以下代码将读取文件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') 
+0

嗨Anoop,感谢您的建议,我不必指定文件的路径?并且将合并的10个文件保存在哪里?我正在尝试以txt格式输出。 – Hrihaan

+0

这是假定您的脚本和输入txt文件位于相同的目录中。并且您的输出文件也将保存在同一个目录中。您始终可以在任何您感觉需要的地方提供路径信息。最后,输出文件存储为.txt,你可以在最后一个for循环的变量fileName中看到,分隔符也是'\ t' –

+0

我试着按照你的指示,得到了这两个错误,1:这一个之后对于我在范围内(1,fileCount + 1)错误:(文件b'A_1.txt'不存在)和2:mergedDataFrames = []后错误:(列表索引超出范围)。我的文件的路径是:C:\ Users \ Hrihaan \ Desktop,您的帮助将非常感激。 – Hrihaan

1

如果你只想结合线,无论内容,你不需要

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) 

或者,你可以使用涉及文件的实际分析的另一种方法。

+0

感谢您的有益答复,我试过了,但它没有找到文件猜测,错误:(FileNotFoundError:[Errno 2]没有这样的文件或目录:'A_1')。 – Hrihaan

+0

@Hrihaan我忘了'.txt'(看着你的问题,而不是你的代码)。现在修复它。 –

+0

@Hrihaan进行了另一次编辑,以更轻松地使用完整路径。 –

1

对于一对文件,首先,分割文件A的内容为行(由换行'\n'字符分割)的阵列,并且不与文件B.相同

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

最后,加入文件A的由'\n'字符线(也就是现在的两个文件线的串联),并做相同的文件B.