簡體   English   中英

Python:使用自定義格式讀取CSV並寫入文件

[英]Python: Read CSV and write to file using a custom format

我有這個.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"

此外,如果選擇加入值為空,則應打印“0”。

這是我到目前為止的代碼....

import csv
import time

# Do the reading
with open('my-scripts/mock.csv', 'r') as f1:
 #next(f1, None)  # skip the headers
 reader = csv.reader(f1)
 new_rows_list = []
 for row in reader:
   if row[5] == '':
      new_row = [row[0],'\t',row[1], row[2], row[3], row[4], '0']
      new_rows_list.append(new_row)
   else:
      new_row = [row[0],'\t',row[1], row[2], row[3], row[4], row[5]]
      new_rows_list.append(new_row)   
 f1.close()   # <---IMPORTANT

# Do the writing
newfilename = 'my-scripts/ftp_745198_'+str(int(time.time()))
with open(newfilename, 'w', newline='') as f2:
 writer = csv.writer(f2, quoting=csv.QUOTE_NONNUMERIC)
 writer.writerows(new_rows_list)
 f2.close()

上面的代碼生成了這個輸出,這不是我想要的...... 我無法弄清楚如何在每行中打印列名,如上圖所示的所需輸出......!

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

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"

我將非常感謝任何幫助/想法/指針。

謝謝

您可以將標題保留在列表中,然后使用列表(如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)]
        ....
...

其次, [row[1], row[2], row[3], row[4], row[5]]可以簡化為[row [i] for i in range(1,6)] ( 發電機

三, 格式是一個很好的工具: print('"%s"="%s"'% (header[1],row[1]))將輸出"first_name"="Jimmy"

使用這些知識並考慮如何使其工作。

  • 最初將標題提取為新列表。

  • 然后將每個行元素的標題附加為字符串。

  • 將其寫入文件。

請試試這段代碼,

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

如有任何疑問,請與我們聯系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM