今晚我从两个文件创建文件时遇到问题。我想实现一个文本文件,它将包含来自第一个文件的3个第一列和来自第二个文件的两个2列。直到现在我已经为这些文件做了很好的阅读和连接,但最后我得到的并不是每一行都只是以正确的方式连接起来。 :(
文件的结构如下: 文件1:
DATA1 DATA2 data3 ......
DATA1 DATA2 data3 ......
文件2:
DATA1 DATA2 data3' data4 ....
DATA1 DATA2 data3' data4 ....
OUTPUTFILE:
DATA1 DATA2 data3 data3' data4
DATA1 DATA2 data3 data3' data4
就像我现在说的那样,我只以正确的方式实现了一排而不是每一行。文件1和文件2没有相同的行数。两个输入文件中的DATA1和DATA2必须相同。 问题是for循环中的某个地方,因为我无法实现完整的文件:( 我将非常感谢我的代码纠错
file1 = open('file1.txt', 'r')
file2 = open('file2.txt', 'r')
finalfile = None
for line in file1:
row1 = line.rstrip().split()
first_column1 = row1[0]
second_column1 = row1[1]
#print(str(first_two_columns1)+ " "+ str(first_three_columns1)+ "\n")
for line in file2:
row2 = line.rstrip().split()
first_column2 = row2[0]
second_column2 = row2[1]
#print(str(first_two_columns1)+ " "+ str(first_two_columns2)+ "\n")
if(float(first_column1) == float(first_column2)) and (second_column1 == second_column2):
rows = row1[0] + " " + row1[1] + " " + row1[2] + " " + row2[2] + " " + row2[3] + "\n"
final_filename = 'final_file_{}.txt'.format(row1[0])
finalfile = open(final_filename, "w")
finalfile.write(rows)
if finalfile:
finalfile.close()
file1.close()
file2.close()
答案 0 :(得分:1)
如果两个文件和输出文件具有相同的行数,并且任务是合并每个对应的一对行形成输入文件以使输出文件的每一行,那么你不希望嵌套循环:
for line in file1:
row1 = line.strip().split()
line = file2.readline()
row2 = line.strip().split()
...
从那里开始构建输出线。
更新:如果输入文件 不匹配,那么您需要从{@ 1}开始为每一行开始阅读file2
{1}},您可以通过为file1
的每一行打开/处理/关闭它,或使用file1
返回到开头。如果lseek
不是太大,您可以将其内容读入字典,这样您只需阅读一次。
答案 1 :(得分:0)
我没有尝试找到代码出错的地方。
首先让我们从每个文件中排序的行开始。有时,对数据进行预排序可以使以后的工作更轻松。
import csv, operator
# key is a callable that returns
# the first two items in a sequence
key = operator.itemgetter(0,1)
# get a sorted list of rows for each file
with open('file1.csv') as one, open('file2.csv') as two:
reader = csv.reader(one)
file_one = sorted(reader, key = key)
#one = sorted(csv.reader(one), key = key)
reader = csv.reader(two)
file_two = sorted(reader, key = key)
#two = sorted(csv.reader(two), key = key)
这假设可能没有匹配,您需要为file2
的每一行迭代file1
。我已经包含了一些内联评论。这不需要预先排序的数据,但仍然可以使用它。
with open ('out.csv', 'w') as out:
writer = csv.writer(out)
for line1 in file_one:
# find the line in file2 that matches
for line2 in file_two:
if line1[:2] == line2[:2]:
# write the new line to the new file
out_line = line1[:3] + line2[2:4]
writer.writerow(out_line)
#stop looking in file2
break
如果,您可以确保file2
,然后始终匹配,您只需要通过每个文件。生成器可以方便地跟踪 file1
迭代。这需要上面定义的每个文件的排序行列表。
# generator function
def lines(iterable):
'''yields succesive items from iterable.
'''
for item in iterable:
yield item
with open ('out.csv', 'w') as out:
writer = csv.writer(out)
file_one = lines(file_two)
for line2 in file_two:
# find the line in file2 that matches
try:
line1 = file_one.next()
while line1[:2] != line2[:2]:
line1 = file_one.next()
except StopIteration:
# no matching lines in file 2
error_text = 'file2 does not have a matching line for ' + line1
raise ValueError(error_text)
out_line = line1[:3] + line2[2:4]
writer.writerow(out_line)