Python 将3个单元格数据合并为一个单元格并写入另一个csv

Python 将3个单元格数据合并为一个单元格并写入另一个csv,python,Python,我试图读取一个csv文件并将数据写入另一个文件。在这个过程中,我面临着一些问题。我想将3个单元格数据合并成一个单元格,然后写入另一个csv文件。请参阅我下面的csv输入文件和输出文件的代码 import csv # initialize with empty ints and dicts name, date_, indus ,nike1, nike2, nike3, paid, _abbr =[],[],[],[],[],[],[],[] with open('company_inf1.cs

我试图读取一个csv文件并将数据写入另一个文件。在这个过程中,我面临着一些问题。我想将3个单元格数据合并成一个单元格,然后写入另一个csv文件。请参阅我下面的csv输入文件和输出文件的代码

import csv
# initialize with empty ints and dicts
name, date_, indus ,nike1, nike2, nike3, paid, _abbr =[],[],[],[],[],[],[],[]

with open('company_inf1.csv','rb') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    reader.next() #skip header
    for row in reader:
        name.append(row[0])
        date.append(row[1])
        indus.append(row[2])
        nike1.append(row[3])
        nike2.append(row[4])
        nike3.append(row[5])
        paid.append(row[6])
        abbr.append(row[7])

cn = list(name)
date = list(date)
indus = list(indus)
inf1 = list(nike1)
inf2 = list(nike2)
inf3 = list(nike3)
paid = list(paid)
abr = list(abbr)

a = [(inf1), (inf2), (inf3)]
b = [int(i[0]) for i in a]
c = [int(i[1]) for i in a]
d = [int(i[2]) for i in a]
t =((b),(c),(d))
with open('test123.csv','w') as cfile:
    writer = csv.writer(cfile, delimiter=',')
    writer.writerow(['id','name', 'date','indus','nike', 'paid ', 'abbr'])
    for i,x in enumerate(cn):
        writer.writerow([i,x ,date[i],indus[i],t,paid[i],abr[i]])
我的Csv文件是

Name    Date    Indus   nike1   nike    nike3   Paid    absr
XYZ 30-06-1987  Service 1   2   3   10000   abs
abc 01-02-1986  MAN 4   5   6   sasa    sa
def 02-02-1985  Abc 7   8   9   saassas qw
jhk 01-02-2002  adads   10  11  12  saasas  qwws
输出为

id  name    date    industry    neki    paid abbr

0   XYZ ########    Service ([1, 2, 3], [4, 5, 6], [7, 8, 9])   10000   abs 

1   abc ########    MAN ([1, 2, 3], [4, 5, 6], [7, 8, 9])   sasa    sa  

2   def ########    Abc ([1, 2, 3], [4, 5, 6], [7, 8, 9])   saassas qw  
输出应该是

id  name    date    industry    sector  paid    abbr

0   XYZ ########    Service ([1, 2,3])  10000   abs 

1   abc ########    MAN ([4, 5, 6]) sasa    sa  

2   def ########    Abc ([7, 8, 9]) saassas qw  

有人能帮我吗?

以下方法应该可以。请注意,所有这些管路均已完全拆除:

a = [(inf1), (inf2), (inf3)]
b = [int(i[0]) for i in a]
c = [int(i[1]) for i in a]
d = [int(i[2]) for i in a]
t = ((b),(c),(d))
以及增加一行:

t = (map(int, (inf1[i], inf2[i], inf3[i])),) # merge three columns together
到枚举(cn)中i,x的
循环。我还修复了一些命名错误的变量

import csv
# initialize with empty ints and lists
name, date_, indus, nike1, nike2, nike3, paid, _abbr = [[] for _ in xrange(8)]

with open('company_inf1.csv', 'rb') as csvfile:
    reader = csv.reader(csvfile, delimiter=',')
    reader.next() # skip header
    for row in reader:
        name.append(row[0])
        date_.append(row[1])
        indus.append(row[2])
        nike1.append(row[3])
        nike2.append(row[4])
        nike3.append(row[5])
        paid.append(row[6])
        _abbr.append(row[7])

cn = list(name)
date = list(date_)
indus = list(indus)
inf1 = list(nike1)
inf2 = list(nike2)
inf3 = list(nike3)
paid = list(paid)
abr = list(_abbr)

with open('test123.csv', 'w') as cfile:
    writer = csv.writer(cfile, delimiter=',')
    writer.writerow(['id', 'name', 'date', 'indus', 'nike', 'paid', 'abbr'])
    for i,x in enumerate(cn):
        t = (map(int, (inf1[i], inf2[i], inf3[i])),) # merge three cols together
        writer.writerow([i, x, date[i], indus[i], t, paid[i], abr[i]])
我认为在一个
for
循环中读取输入文件和同时写入输出文件会更好,因为这样会更简单,并且不需要一次读取所有数据并将其存储到内存中(因此不会有那么多变量)

我的意思是:

import csv

with open('company_inf1.csv', 'rb') as inf, open('test123.csv', 'w') as outf:
    reader = csv.reader(inf, delimiter=',')
    reader.next() # skip header
    writer = csv.writer(outf, delimiter=',')
    writer.writerow(['id', 'name', 'date', 'indus', 'nike', 'paid', 'abbr'])
    for i, (name, date, indus, nike1, nike2, nike3, paid, abbr) in enumerate(reader):
        t = (map(int, (nike1, nike2, nike3)),) # convert & merge together 3 cols
        writer.writerow([i, name, date, indus, t, paid, abbr])

以下是一个简单的解决方案,它将所有nike组合在一起,并在一个循环中编写:

import csv

with open('company_inf1.csv','rb') as csvfile, open('out.csv', 'w') as outfile:
    writer = csv.writer(outfile)
    writer.writerow(['id','name', 'date','indus','nike', 'paid', 'abbr'])
    reader = csv.reader(csvfile)
    reader.next() # skip header
    for id, (name, date, industry, nike1, nike2, nike3, paid, abbreviation) in enumerate(reader):
        nike = '([{0},{1},{2}])'.format(nike1, nike2, nike3)
        writer.writerow([id, name, date, industry, nike, paid, abbreviation])
请注意:

  • 我将这两个循环组合成一个循环,这样可以稍微加快速度,并且使用更少的内存,因为我不必将文件内容存储在列表中。如果文件很大,这一点很重要
  • 一般来说,我不会缩写变量名,除非它很长
  • 作为个人偏好,我不只是在创建CSV读写器时指定分隔符(如果不是逗号)

您是否通过调试器完成了此操作?尝试添加
导入pdb;pdb.在第一行设置_trace()
,并使用“n”命令执行步骤。您可以使用“p”命令显示您想要查看的内容,或者键入调试器命令的“help”。谢谢,我确实使用了完整的t=(map(int,(inf1[i]、inf2[i]、inf3[i])),但我想传递字符串当我在nike 1 nike 2和nike 3中传递字符串时应该传递的内容。我遇到以下错误C:\Python27>python jaimatadi.py回溯(最后一次调用):文件“jaimatadi.py”,第10行,在t=(映射(int,(nike1,nike2,nike3)),#映射并合并3个cols值错误:int()的文字无效以10为基数:“扇区”从csv中读取所有内容作为字符串,并在写入时转换为字符串,因此我不确定您的意思。也许您可以尝试
t=str(map(int,(nike1,nike2,nike3)),)
'sector'
?那是什么?不管怎样,错误消息意味着
nike1
nike2
nike3
字段中的某些内容不是有效的10位数基数。它也会发生在原始代码中,在a中的i的
[int(i[0])中的一个字段中
行,尝试对三个字段中的每一个执行相同的操作。我喜欢使用
DictReader/DictWriter
,但这也很好。