-2

我在用 python 做作业时遇到问题。我是 python 新手,所以我是一个完整的初学者。

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

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,,,,

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

4

3 回答 3

4

以下是解决问题的一种方法可以遵循的步骤。在此我将使用FileA,FileBResult作为各种文件名。

解决这个问题的一种方法是给文件中的每个位置(每个,)一个数字来引用它,然后你从 读取行FileA,然后你知道在第一行之后,你需要把第一行从FileB构建你的结果你会写出来的Result

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

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

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

现在下一部分是遍历 from 的行列表FileA,将它们与 from 的列表匹配FileB,以创建一个您将写入Result文件的新行。您可以通过多种方式做到这一点,但一种简单的方法是:

  1. 首先创建一个空列表来存储您的结果 ( final_lines = [])
  2. 循环遍历包含 for 行的FileA列表for

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

  1. 用于append()以正确的顺序将项目添加到final_lines.

现在您已经准备好行列表,最后一部分很简单:

  1. 打开一个新文件(使用withopen
  2. 依次通过final_lines
  3. 将每一行写入文件(确保不要忘记行尾字符)。
  4. 关闭文件。

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

于 2012-08-16T04:52:10.857 回答
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
于 2012-08-16T04:12:31.643 回答
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)
于 2012-08-16T03:20:15.813 回答