2014-09-22 53 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