【问题标题】:python: merge two csv filespython:合并两个csv文件
【发布时间】:2012-08-12 09:29:19
【问题描述】:

我在使用 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,,,,

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

【问题讨论】:

标签: python csv


【解决方案1】:

您可以按照以下步骤来解决问题的一种方法。在本文中,我将使用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. 关闭文件。

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

【讨论】:

    【解决方案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
    

    【讨论】:

    • 不错 - 但这里的目标是使用 Python 作为其作业。
    【解决方案3】:

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

    类似这样的:

    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)
    

    【讨论】:

    • 这有几个(很容易解决!)问题。 (1) 它泄露了文件引用。 (2) f2 中不在 f1 中的任何第一个元素在第二个循环中访问时都会引发 KeyError。 (3) extend 是一个就地方法并返回 None,因此该行无论如何都不起作用。 (4) writewriter 的拼写错误。 (5) for k,v in mydict 将不起作用,因为对 mydict 的迭代是在键上,而不是在键值对上。 for k in mydictfor k,v in mydict.items():for k,v in mydict.iteritems(): 都可以,但是 (6) 这不会按排序顺序产生输出。
    • (7) 为作业问题提供代码通常不是一个好主意。这个想法是教,而不是勺子喂。我们的行业还没有足够多的无能者来鼓励更多人吗?
    猜你喜欢
    • 2020-03-18
    • 2019-03-27
    • 2013-04-22
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 2020-08-22
    • 2019-02-22
    • 1970-01-01
    相关资源
    最近更新 更多