2017-10-18 120 views
0

我保存爲.csv閱讀CSV用逗號作爲斷行

"400":0.1,"401":0.2,"402":0.3 

文件最後,我希望將數據以適當的格式保存在作進一步處理CSV文件。問題是文件中沒有換行符。

pathname = r"C:\pathtofile\file.csv"  

with open(pathname, newline='') as file: 
    reader = file.read().replace(',', '\n') 
    print(reader) 
    with open(r"C:\pathtofile\filenew.csv", 'w') as new_file: 
     csv_writer = csv.writer(new_file) 
     csv_writer.writerow(reader) 

打印讀取器輸出看起來完全是我想要的(或者至少它是我可以進一步處理的格式)。

"400":0.1 
"401":0.2 
"402":0.3 

現在我想保存到一個新的csv文件。然而,輸出看起來像

"""",4,0,0,"""",:,0,.,1," 
","""",4,0,1,"""",:,0,.,2," 
","""",4,0,2,"""",:,0,.,3 

我敢肯定,這將是智能化的格式轉換爲

400,0.1 
401,0.2 
402,0.3 

在這個階段,而不是與其他腳本以後做的。

主要的問題是,我當前的代碼

with open(pathname, newline='') as file: 
    reader = file.read().replace(',', '\n') 
    reader = csv.reader(reader,delimiter=':') 
    x = [] 
    y = [] 
    print(reader) 
    for row in reader: 
     x.append(float(row[0])) 
     y.append(float(row[1]))   

print(x) 
print(y) 

工作正常的CSV文件,我目前擁有的類型,但對於這些上述不起作用:

y.append(float(row[1])) 
IndexError: list index out of range 

所以我試圖找到一種與他們合作的方式。我想我錯過了一些明顯的東西,因爲我認爲正確定義文件的換行符和分隔符並不難。

with open(pathname, newline=',') as file: 

產生

ValueError: illegal newline value: , 

回答

1

csv模塊正確的方法,而無需更換和鑄造float

import csv 

with open('file.csv', 'r') as f, open('filenew.csv', 'w', newline='') as out: 
    reader = csv.reader(f) 
    writer = csv.writer(out, quotechar=None) 
    for r in reader: 
     for i in r: 
      writer.writerow(i.split(':')) 

所得filenew.csv內容(根據你 「智能」 條件):

400,0.1 
401,0.2 
402,0.3 

細微差別

  • csv.readercsv.writer對象對待逗號,作爲默認的分隔符(無需file.read().replace(',', '\n')

  • quotechar=Nonecsv.writer對象指定消除周圍的值雙引號被保存

+0

工程就像一個迷人的!我知道這是默認分隔符,這就是爲什麼我最終想要「智能」格式的原因。如何分裂:導致每一行都有一個新行,? – idkfa

+0

@idkfa,每個「」400「:0.1」序列被認爲是一個字段。通過':'拆分序列將給出一個值作爲輸出文件 – RomanPerekhrest

+0

的獨立行的值列表。因此,因爲我的數據的格式爲field1,field2,field3拆分每個字段將導致一個新的行?因此,當我在part1_field1和part2_field1中分割field1時,它會自動轉換爲part1_field1,part2_field1 \ n?那很整齊。 – idkfa

0

如果你看一下文檔中,write_row,它說:

寫行參數筆者的文件 對象,格式化根據當前方言。

但是,你在你的代碼

csv_writer.writerow(reader) 

寫整個字符串,因爲reader在這一點上的字符串。 現在,您想要在CSV文件中使用的格式在問題中未明確提及。但正如您所說,如果您可以執行一些預處理來創建列表的列表並將每個子列表傳遞到writerow(),則應該能夠生成所需的文件格式。

+0

這個答案definitly幫助我理解我在我的writerow的使用錯誤,但對如何分割我的文件是正確相較於其他答案缺少的重要組成部分。我對任何一種格式都可以,但我認爲我的「智能」格式應該是csv文件最常用的格式。 – idkfa

1

您需要拆分t他重視形成一個列表來代表一排。目前代碼將字符串拆分爲單個字符來表示行。

pathname = r"C:\pathtofile\file.csv"  

with open(pathname) as old_file: 
    with open(r"C:\pathtofile\filenew.csv", 'w') as new_file: 
     csv_writer = csv.writer(new_file, delimiter=',') 
     text_rows = old_file.read().split(",") 
     for row in text_rows: 
      items = row.split(":") 
      csv_writer.writerow([int(items[0]), items[1])