2012-08-16 128 views
-2

我在使用python执行任务时遇到问题。 我是新来的python,所以我是一个完整的初学者。python:合并两个csv文件

问题:如何合并下面的两个文件?

s555555,7 
s333333,10 
s666666,9 
s111111,10 
s999999,9 

s111111,,,,, 
s222222,,,,, 
s333333,,,,, 
s444444,,,,, 
s555555,,,,, 
s666666,,,,, 
s777777,,,,, 

合并后,它应该是这个样子:

s111111,10,,,, 
s222222,,,,, 
s333333,10,,,, 
s444444,,,,, 
s555555,7,,,, 
s666666,9,,,, 
s777777,,,,, 
s999999,9,,,, 

感谢您的阅读和任何帮助,将不胜感激!

+0

[你有什么尝试?](http://whathaveyoutried.com) – Blair 2012-08-16 04:52:52

+0

不要让人们做你的功课。你在考试中会做什么?问问你旁边的人? – profitehlolz 2012-08-16 17:05:04

+1

家庭作业机构完全可以在这里http://stackoverflow.com/faq#questions – bortzmeyer 2012-09-23 14:49:44

回答

1

使用第一个元素作为主键制作一个字典,然后合并行?

事情是这样的:

f1 = csv.reader(open('file1.csv', 'rb')) 
f2 = csv.reader(open('file2.csv', 'rb')) 

mydict = {} 
for row in f1: 
    mydict[row[0]] = row[1:] 

for row in f2: 
    mydict[row[0]] = mydict[row[0]].extend(row[1:]) 

fout = csv.write(open('out.txt','w')) 
for k,v in mydict: 
    fout.write([k]+v) 
+0

这有几个(很容易修复!)的问题。 (1)它泄漏文件参考。 (2)f2中的任何第一个元素都不在f1中,当它在第二个循环中被访问时将引发KeyError。 (3)'extend'是一个in-place方法,并返回None,因此该行无法正常工作。 (4)'write'是'writer'的拼写错误。 (5)'for k,v in mydict'将不起作用,因为'mydict'上的迭代遍布键,而不是键值对。无论是'for m in mydict'还是'for k,v in mydict.items():'or'for k,v in mydict.iteritems():'都可以工作,但是(6)这不会在排序中产生输出订购。 – DSM 2012-08-16 04:27:09

+1

(7)为作业问题提供代码通常不是一个好主意。这个想法是_teach,_不是勺子喂。在我们的行业中,我们是不是已经有足够多的不称职者,并鼓励更多? – paxdiablo 2012-08-16 04:44:44

2

不涉及Python,但在Linux上:

sort -k1 c1.csv > sorted1 
sort -k1 c2.csv > sorted2 
join -t , -11 -21 -a 1 -a 2 sorted1 sorted2 

结果:

s111111,10,,,,, 
s222222,,,,, 
s333333,10,,,,, 
s444444,,,,, 
s555555,7,,,,, 
s666666,9,,,,, 
s777777,,,,, 
s999999,9 
+2

不错 - 但这里的目标是使用Python作为它的功课。 – 2012-08-16 05:12:22

4

这里是你可以按照一个方法步骤解决问题。在这里,我将使用FileAFileBResult作为各种文件名。要解决这个问题

一种方法是给文件中的每个位置(每个,)一批通过引用它,那么你读FileA行,那么你知道第一个,后,你需要把第一行FileB建立你的结果,你会写出Result

  1. 打开FileA。理想情况下,您应该使用with statement,因为它会在文件完成时自动关闭该文件。或者您可以使用正常的open()调用,但请确保在完成后关闭文件。

  2. 循环遍历FileA的每一行并将其添加到list。 (提示:你应该使用split())。为什么列表?它使得通过索引来引用项目变得更容易,因为这是我们的计划。

  3. FileB重复步骤1和2,但将其存储在不同的列表变量中。

现在,下部分是通过线从FileA列表是循环,与列表匹配他们FileB,创建一个新的行,你会写Result文件。你可以做到这一点的方法很多,但一个简单的方法是:

  1. 首先创建一个将存储您的结果(final_lines = []
  2. 循环通过在一个for环路FileA线列表中的空列表。

您还应该记住,并非来自FileA的每一行都会有相应的行FileB。对于FileA的列表中的每个第一个“位”,找到FileB的列表中相应的行,然后使用index()获取下一个项目。如果你非常喜欢,你会意识到第一项总是0,而下一项总是1,那么为什么不简单地对这些值进行硬编码呢?如果你看看这个作业,有多个, s,所以可能有些时候你需要添加第四个或第五个“列”。老师们喜欢检查这些东西。

  1. 使用append()将项目按正确顺序添加到final_lines

现在,你有行列表准备就绪后,最后一部分是简单的:

  1. 打开一个新文件(使用withopen
  2. 遍历final_lines
  3. 写每一行到文件中(确保你不会忘记行结束符)。
  4. 关闭文件。

如果您有任何具体问题,请询问。