用pandas读取格式错误的'csv'文件

lex*_*lex 1 python csv pandas

我有一个格式错误的"csv"文件:

txt = """NAME;a;b;c
ATTR1;1;2;3
ATTR2;1;2;3;;;
ATTR3;1;2;3;
ATTR4;1;2;3"""
Run Code Online (Sandbox Code Playgroud)

我有办法使用pandas pd.read_*工具箱来获得以下内容pd.DataFrame:

|---+-------+---+---+---|
|   | 0     | 1 | 2 | 3 |
|---+-------+---+---+---|
| 0 | NAME  | a | b | c |
| 1 | ATTR1 | 1 | 2 | 3 |
| 2 | ATTR2 | 1 | 2 | 3 |
| 3 | ATTR3 | 1 | 2 | 3 |
| 4 | ATTR4 | 1 | 2 | 3 |
|---+-------+---+---+---|
Run Code Online (Sandbox Code Playgroud)

PS我知道如何做到这一点 import csv

谢谢你的想法和BR,Lex

编辑

这是来自真实文件的玩具示例(我再次不得不修改)......

SRC = 'https://dl.dropboxusercontent.com/u/40513206/test.csv'
NA_VALUES = ['', '#N/A N/A', '#N/A Field Not Applicable', '#N/A Invalid Field',
         '#N/A Invalid Security', '#N/AN/A', '#N/A Limit', '#####', '#DIV/0!', 
         '#N/A', '#NAME?', '#NULL!', '#NUM!', '#REF!', '#VALUE!']
CSV_ENCODING = 'WINDOWS-1252'
S_ROWS = 6
NR_ROWS = 60
NR_COLS = 52 # correct nr. of columns, but not always known

dat_m = pd.read_csv(SRC, sep = ';', header = None, index_col = None, skiprows = S_ROWS, 
                nrows = NR_ROWS, encoding = CSV_ENCODING, na_values = NA_VALUES, names = range(NR_COLS))
Run Code Online (Sandbox Code Playgroud)

似乎如果我们使用names参数那么NR_COLS必须是>=实际的nr.第一行中的列,如果不是这样,那么IndexMultiIndex形成(基于实际列),例如,如果NR_COLS = 50那么索引有2个级别,如果NR_COLS = 49那么3个级别等.

所有这些都是我保存Excel到的结果csv,它似乎添加sep = ';'到某些行,并且由于某些其他原因我不能xls直接使用(读取)文件.

所以我将使用大NR_COLS值或继续csv库.

谢谢!

DSM*_*DSM 5

怎么样:

>>> txt = 'NAME;a;b;c\nATTR1;1;2;3\nATTR2;1;2;3;;;\nATTR3;1;2;3;\nATTR4;1;2;3'
>>> pd.read_csv(StringIO(txt),sep=";",names=range(4))
       0  1  2  3
0   NAME  a  b  c
1  ATTR1  1  2  3
2  ATTR2  1  2  3
3  ATTR3  1  2  3
4  ATTR4  1  2  3

[5 rows x 4 columns]
Run Code Online (Sandbox Code Playgroud)

有时候,我不知道有多少列有事前我做了什么愚蠢的像names=range(128),然后.dropna(how='all', axis=1).