2014-09-22 90 views
1

帶引號的字段是否有一種簡單的方法在python中加載一個csv文件,可能包含下面列出的行到數據框?蟒蛇加載csv文件與逗號用作1000年分隔

1.0, 2.0, 3.0, "123,456,789.999" 
1000.0, 2000.0, 3000.0, "123,456,789.123" 

很明顯,所有列的類型都應該是數字型的(float64, int64, etc.)。另外,有些國家使用(space)" "作爲1000分隔符而不是comma。有沒有一種方法來指定?

+1

我不認爲你可以爲同一個文件指定2種不同類型的分隔符。但是你可以指定一個分隔符是。看看'csv'庫。 https://docs.python.org/2/library/csv.html – 2014-09-22 15:13:32

+0

你提到一個「數據框」,你是指'pandas.DataFrame'? – 2014-09-22 15:23:09

+0

是的,我的意思是一個熊貓數據框。或者真的變成什麼東西,後來可以轉換成熊貓數據框... – Thomas 2014-09-22 15:31:12

回答

1

pandas.io.parsers.read_table可以處理逗號分隔的數字提供給你一個converters的論點,即處理逗號:

converters:字典。可選字典功能用於轉換 某些列中的值。鍵可以是整數或列標籤

這裏是香草的Python的解決方案:

import csv 

def try_convert_number(s): 
    val = s.replace(',', '') 
    try: 
     return int(val) 
    except ValueError: 
     try: 
      return float(val) 
     except ValueError: 
      return s 
result = [] 
# in Python 2 use: with open('file.csv', 'rb') as f: 
with open('file.csv', newline='') as f: 
    reader = csv.reader(f) 
    if you_have_a_header_row: 
     next(reader) 
    for row in reader: 
     result.append(map(try_convert_number, row)) 

另一種選擇是創建缺少多餘的逗號新的CSV文件:

def replace_commas(s): 
    return s.replace(',', '') 

with open('orig.csv', newline='') as fin, open('new.csv', newline='') as fout: 
    reader = csv.reader(fin) 
    writer = csv.writer(fout) 
    for row in reader: 
     writer.writerow(map(replace_commas, row)) 
+0

非常感謝史蒂文。這與我現在所做的相似;完成後我會分享它。我希望只有python中衆多的閱讀器功能,至少其中一個能夠處理這種情況。 – Thomas 2014-09-22 19:24:00