Python:使用自定义格式读取CSV并写入文件

Python:使用自定义格式读取CSV并写入文件,python,csv,Python,Csv,我有这个.csv文件 id,first_name,last_name,email,date,opt-in 1,Jimmy,Reyes,jreyes0@macromedia.com,12/29/2016,FALSE 2,Doris,Wood,dwood1@1und1.de,04/22/2016, 3,Steven,Miller,smiller2@go.com,07/31/2016,FALSE 4,Earl,Parker,eparker3@ucoz.com,01-08-17,FALSE 5,Barb

我有这个.csv文件

id,first_name,last_name,email,date,opt-in
1,Jimmy,Reyes,jreyes0@macromedia.com,12/29/2016,FALSE
2,Doris,Wood,dwood1@1und1.de,04/22/2016,
3,Steven,Miller,smiller2@go.com,07/31/2016,FALSE
4,Earl,Parker,eparker3@ucoz.com,01-08-17,FALSE
5,Barbara,Cruz,bcruz4@zdnet.com,12/30/2016,FALSE
我想读取上面显示的csv文件,转换数据,最后将数据写入另一个文本文件中,该文件应如下所示……

1,<tab>"first_name"="Jimmy","last_name"="Reyes","email"="jreyes0@macromedia.com","date"="12/29/2016","opt-in"="FALSE"
2,<tab>"first_name"="Doris","last_name"="Wood","email"="dwood1@1und1.de","date"="04/22/2016,,"opt-in"="0"
新CSV

id,first_name,last_name,email,date,opt-in,unique_code
1,Jimmy,Reyes,jreyes0@macromedia.com,12/29/2016,FALSE,ER45DH
2,Doris,Wood,dwood1@1und1.de,04/22/2016,,MU34T3
3,Steven,Miller,smiller2@go.com,07/31/2016,FALSE,G34FGH
4,Earl,Parker,eparker3@ucoz.com,01-08-17,FALSE,ASY67J
5,Barbara,Cruz,bcruz4@zdnet.com,12/30/2016,FALSE,NHG67P
新的预期产出

ER45DH<tab>"id"="1","first_name"="Jimmy","last_name"="Reyes","email"="jreyes0@macromedia.com","date"="12/29/2016","opt-in"="FALSE"
MU34T3<tab>"id"="2","first_name"="Doris","last_name"="Wood","email"="dwood1@1und1.de","date"="04/22/2016,"opt-in"="0"
ER45DH“id”=“1”,“名字”=“吉米”,“姓氏”=“雷耶斯”,“电子邮件”=”jreyes0@macromedia.com,“日期”=“2016年12月29日”,“选择加入”=“错误”
MU34T3“id”=“2”,“名字”=“Doris”,“姓氏”=“Wood”,“电子邮件”=”dwood1@1und1.de,“日期”=“2016年4月22日”,选择加入“=“0”
我将非常感谢任何帮助/想法/建议


感谢您可以将标题保存在列表中,然后使用列表中的元素(如first_name等)匹配后续行中的元素(如Jimmy等),以生成所需的输出(“first_name”=“Jimmy”)。

首先,将标题保存到变量中。例如:

for i,row in enumerate(reader):
    if i == 0:
        header = row
    else:
        new_row = [row[0],'\t'] + ['%s=%s' % (header[j],row[j]) for j in range(1,6)]
        ....
...
其次,对于范围(1,6)中的i,诸如
[行[1],行[2],行[3],行[4],行[5]]之类的代码可以简化为[行[i]

第三,这是一个很好的工具:
打印('%s'=%s'%(标题[1],行[1])
将输出
“名字”=“吉米”

使用这些知识并考虑如何使之有效。

UL>
  • 最初将标题提取为新列表

  • 然后将每行元素作为字符串附加到标题

  • 将其写入文件

  • 请尝试此代码

    import csv
    
    with open('newfilename.csv', 'w') as f2:
        with open('mycsvfile.csv', mode='r') as infile:
            reader = csv.reader(infile)
            for i,rows in enumerate(reader):
                if i == 0:
                   header = rows 
                else:
                    if rows[5] == '':
                       rows[5] = 0;
                    pat = rows[0]+'\t'+'''"%s=%%s",'''*(len(header)-1)+'\n'
                    print pat
                    f2.write(pat % tuple(header[1:]) % tuple(rows[1:]))
        f2.close()
    
    输出:

    1   "first_name=Jimmy","last_name=Reyes","email=jreyes0@macromedia.com","date=12/29/2016","opt-in=FALSE",
    2   "first_name=Doris","last_name=Wood","email=dwood1@1und1.de","date=04/22/2016","opt-in=0",
    3   "first_name=Steven","last_name=Miller","email=smiller2@go.com","date=07/31/2016","opt-in=FALSE",
    4   "first_name=Earl","last_name=Parker","email=eparker3@ucoz.com","date=01-08-17","opt-in=FALSE",
    5   "first_name=Barbara","last_name=Cruz","email=bcruz4@zdnet.com","date=12/30/2016","opt-in=FALSE",
    

    如果您有任何疑问,请告诉我。

    您需要“”或tab?我需要tab'\t'好奇,您为什么说
    f1.close()
    很重要吗?@glibdud我打开阅读的文件有大约50列,包含大约150K行。因此为了安全起见,我将显式关闭它,以避免出现任何内存外错误。虽然我在某个地方读到了,但现在不需要这样做,因为默认情况下它是关闭的。@PuneetSharma是的,只要您使用
    使用open…
    construct,当您退出块时,它应该会自动关闭。谢谢@Gang是的,我考虑过这种方法,但我有大约50列。手动操作有点乏味,所以我想一定有其他更快速/更高效的方法…?@PuneetSharma,一旦列数固定,一个loo我认为p应该按照您的期望完成这项工作。谢谢@ZearSeeker,我尝试了您的建议,我收到了这个错误,
    header=row.split(“,”)AttributeError:“list”对象没有属性“split”
    @PuneetSharma很抱歉弄错了您。行已经是标题列表。因此您不需要拆分它,只需
    header=row
    就足够了。然后您可以使用
    标题[1]
    标题[2]
    以获得
    。我将修改我的回答Thank@Karthikeyan KR。我更改了下面的行以根据我的规范生成输出,所有工作都很好…非常感谢您的帮助。
    pat=rows[0]+'\t'+''''%s'=“%%s”,“'*(len(header)-1)+“\n”
    快速提问。我如何不在最后一个值后添加逗号?请更改为以下pat=行[0]+'\t'+''''''%s'=“%%s”、''*(len(header)-2)+''''%s'=“%%s”\n'''谢谢,现在我遇到了一个奇怪的错误…
    文件“我的脚本/filecon.py”,第21行,在f2中。写入(pat%tuple(header[1:])%tuple(rows[1:]))文件”c:\Python36\lib\encodings\cp1252.py”,第19行,在encode return codec.charmap_encode(输入,self.errors,encoding_table)[0]Unicodeincoder错误:“charmap”编解码器无法对112-113位置的字符进行编码:字符映射到它的​ Unicode错误。您可能有外来字符。请尝试将字符串编码为UTF-8格式。
    
    import csv
    
    with open('newfilename.csv', 'w') as f2:
        with open('mycsvfile.csv', mode='r') as infile:
            reader = csv.reader(infile)
            for i,rows in enumerate(reader):
                if i == 0:
                   header = rows 
                else:
                    if rows[5] == '':
                       rows[5] = 0;
                    pat = rows[0]+'\t'+'''"%s=%%s",'''*(len(header)-1)+'\n'
                    print pat
                    f2.write(pat % tuple(header[1:]) % tuple(rows[1:]))
        f2.close()
    
    1   "first_name=Jimmy","last_name=Reyes","email=jreyes0@macromedia.com","date=12/29/2016","opt-in=FALSE",
    2   "first_name=Doris","last_name=Wood","email=dwood1@1und1.de","date=04/22/2016","opt-in=0",
    3   "first_name=Steven","last_name=Miller","email=smiller2@go.com","date=07/31/2016","opt-in=FALSE",
    4   "first_name=Earl","last_name=Parker","email=eparker3@ucoz.com","date=01-08-17","opt-in=FALSE",
    5   "first_name=Barbara","last_name=Cruz","email=bcruz4@zdnet.com","date=12/30/2016","opt-in=FALSE",