2016-08-04 105 views
1

我試圖用分隔符'@ | @'生成csv,但是我無法通過下面的代碼實現。如何使用'csv'模塊在「分隔符」中輸入2個字符?

import csv 
ifile = open('test.csv', "rb") 
reader = csv.reader(ifile) 
ofile = open('ttest.csv', "wb") 
writer = csv.writer(ofile, delimiter='|', quotechar='"', quoting=csv.QUOTE_ALL) 
for row in reader: 
    writer.writerow(row) 
ifile.close() 
ofile.close() 

運行時,它拋出錯誤。

Traceback (most recent call last): 

File "csvfile.py", line 6, in <module> 
writer = csv.writer(ofile, delimiter='@|@', quotechar='"', quoting=csv.QUOTE_ALL) 
TypeError: "delimiter" must be an 1-character string 

我該如何做到這一點?

+1

替換( '@ | @', '|')或到一些不以你的字符串 – YOU

+0

'包含 '@ | @''看起來像一個三個字符分隔符......並且回溯中的代碼與代碼段中的代碼不匹配。 – martineau

回答

1

以CSV documentation他們說

用於分隔字段一個字符的字符串。它默認爲','。

所以你可以做這個選擇。

csv.reader((line.replace('@|@', '|') for line in ifile), delimiter='|') 

所以完整的代碼,

import csv 
ifile = open('test.csv', "rb") 
reader = csv.reader((line.replace('@|@', '|') for line in ifile), delimiter='|') 
ofile = open('ttest.csv', "wb") 
writer = csv.writer(ofile, delimiter='|', quotechar='"', quoting=csv.QUOTE_ALL) 
for row in reader: 
    writer.writerow(row) 
ifile.close() 
ofile.close() 
0

生命太短暫,只使用pandas

import pandas as pd 
df.to_csv('output.csv', sep='|') 

默認情況下,delimiator是',',這就是爲什麼它被稱爲Commasv 。但通過將sep更改爲'|',您可以簡單地實現你想要的。

0

csvfile參數csv.writer構造函數只能是一個「類文件對象」。這意味着您可以提供您自己的類的實例,它將單個字符更改爲具有兩個或更多個字符的字符(但其行爲類似於打開的輸出文件對象)。

這裏就是我的意思是:

import csv 

class CSV_Translater(object): 
    """ Output file-like object that translates characters. """ 
    def __init__(self, f, old, new): 
     self.f = f 
     self.old = old 
     self.new = new 
    def write(self, s): 
     self.f.write(s.replace(self.old, self.new)) 
    def close(self): 
     self.f.close() 
    def flush(self): 
     self.f.flush() 

with open('in_test.csv', "rb") as ifile: 
    reader = csv.reader(ifile) 
    with open('out_test.csv', "wb") as ofile: 
     translater = CSV_Translater(ofile, '|', '@|@') 
     writer = csv.writer(translater, delimiter='|', quotechar='"', 
          quoting=csv.QUOTE_ALL) 
     for row in reader: 
      writer.writerow(row) 
相關問題