如何合并使用Python的CSV字符串中的字段?

问题描述:

我想在Python的每一行CSV文件中合并三个字段。这很简单,除了一些字段被双引号包围并包含逗号。这里有一个例子:如何合并使用Python的CSV字符串中的字段?

,,Joe,Smith,New Haven,CT,"Moved from Portland, CT",,goo, 

有一个简单的算法,可以合并域7-9这种格式的每一行?并非所有行都在双引号中包含逗号。

谢谢。

像这样的东西?

import csv 
source= csv.reader(open("some file","rb")) 
dest= csv.writer(open("another file","wb")) 
for row in source: 
    result= row[:6] + [ row[6]+row[7]+row[8] ] + row[9:] 
    dest.writerow(result) 

>>> data=''',,Joe,Smith,New Haven,CT,"Moved from Portland, CT",,goo, 
... '''.splitlines() 
>>> rdr= csv.reader(data) 
>>> row= rdr.next() 
>>> row 
['', '', 'Joe', 'Smith', 'New Haven', 'CT', 'Moved from Portland, CT', '', 'goo', '' ] 
>>> row[:6] + [ row[6]+row[7]+row[8] ] + row[9:] 
['', '', 'Joe', 'Smith', 'New Haven', 'CT', 'Moved from Portland, CTgoo', ''] 
+0

@美国洛特:对不起,打乱了苹果车,但实际上读的代码表明,结果将是3个元素的元组,其中第一和第三将是名单......因此输出将成为混杂。 – 2009-08-04 00:38:56

有Python中的内置模块,用于解析CSV文件:

http://docs.python.org/library/csv.html

您已经标记了这个问题,因为 '数据库'。实际上,将这两个文件上传到db的不同表(可以使用sqllite或任何python sql库,如sqlalchemy)然后加入它们可能会更容易。

这会给你一些优势后,你将能够使用SQL语法来查询表,你可以将它存储在磁盘上,而不是将它保存在内存中,所以想想它.. :)

您可以使用csv模块来完成繁重工作:http://docs.python.org/library/csv.html

您没有明确说明您希望如何合并列;大概你不希望你的合并的领域是“从波特兰,CTgoo移动”。下面的代码允许您指定分隔符字符串(可能为", ")并处理空白/空白字段。

[transcript of session] 
prompt>type merge.py 
import csv 

def merge_csv_cols(infile, outfile, startcol, numcols, sep=", "): 
    reader = csv.reader(open(infile, "rb")) 
    writer = csv.writer(open(outfile, "wb")) 
    endcol = startcol + numcols 
    for row in reader: 
     merged = sep.join(x for x in row[startcol:endcol] if x.strip()) 
     row[startcol:endcol] = [merged] 
     writer.writerow(row) 

if __name__ == "__main__": 
    import sys 
    args = sys.argv[1:6] 
    args[2:4] = map(int, args[2:4]) 
    merge_csv_cols(*args) 

prompt>type input.csv 
1,2,3,4,5,6,7,8,9,a,b,c 
1,2,3,4,5,6,,,,a,b,c 
1,2,3,4,5,6,7,8,,a,b,c 
1,2,3,4,5,6,7,,9,a,b,c 

prompt>\python26\python merge.py input.csv output.csv 6 3 ", " 

prompt>type output.csv 
1,2,3,4,5,6,"7, 8, 9",a,b,c 
1,2,3,4,5,6,,a,b,c 
1,2,3,4,5,6,"7, 8",a,b,c 
1,2,3,4,5,6,"7, 9",a,b,c