簡體   English   中英

CSV模塊在Python中的應用有些不對勁

[英]Something not quite right with application of CSV Module in Python

我有一個試圖寫入數據具有以下格式的文件的字符串:

100.10 89.7 1,891.43 123.99 

我想轉換為以下格式:

"100.10","89.7","1,891.43","123.99", 

但是,使用以下代碼(其中文件filepath在代碼中之前定義為文本文件位置,而data2是字符串:

csv.register_dialect('sas', delimiter=',',quoting=csv.QUOTE_ALL)

with open(filepath, "w") as f:
    writer = csv.writer(f, dialect='sas')
    writer.writerow(data2)

我得到以下輸出:

 "1","0","0",".",1,"0","8","9",".","7","1","8","9","1",".","4","3","1","2","3",".","9","9", 

我想用引號掩蓋數據中可能出現的逗號,我在做什么錯呢?

您將一個字符串傳遞給writerow ,因此它遍歷字符,在每個字符之間放置一個逗號。 最小修復是:

writer.writerow(data2.split(" "))

另外,將數據保存在列表中可能比將字符串放在首位更方便!

my_string = '100.10 89.7 1891.43 123.99'

string_list = my_string.split()

然后string_list返回:

['100.10', '89.7', '1891.43', '123.99']

當您這樣做時:

csv.register_dialect('sas', delimiter=',',quoting=csv.QUOTE_ALL)

with open(filepath, "w") as f:
    writer = csv.writer(f, dialect='sas')
    writer.writerow(data2)

它按字符分割data2,因此當您讀回它時,會將每個字符讀為單獨的列。 您可能想要這樣:

csv.register_dialect('sas', delimiter=',',quoting=csv.QUOTE_ALL)

with open(filepath, "w") as f:
    writer = csv.writer(f, dialect='sas')
    writer.writerow(data2.split())

編輯

因此,我可能會建議使用其他方法,而忘記注冊方言,這對我而言始終是有問題的。

string_list = ['100.10', '89.7', '1,891.43', '123.99']
with open(filepath, 'w') as f:
    writer = csv.writer(f, quoting=csv.QUOTE_ALL)
    writer.writerow(string_list)

with open(filepath, 'r') as f:
    print f.read()

對我來說:

"100.10","89.7","1,891.43","123.99"

with open(filepath, 'rU') as f:
    reader = csv.reader(f, quoting=csv.QUOTE_ALL)
    data = next(reader) # next(reader) gives us the iterable's first row.

data

收益:

['100.10', '89.7', '1,891.43', '123.99']

因此,在編寫時,請執行以下操作:

with open(filepath, "w") as f:
    writer = csv.writer(f, quoting=csv.QUOTE_ALL)
    writer.writerow(data2.split()) # *write here

您可能打算寫一堆行,因此請確保遍歷要寫的行,或者使用writerows而不是writerow 請參閱文檔中的示例。

暫無
暫無

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

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