ParserError与熊猫read_csv

lan*_*ada 5 python csv python-3.x pandas

我正在尝试读取一个txt文件,其每行的列数不同。这是我文件的开头:

60381 6
1 0.270 0.30 0.30 0.70 0.70
4.988 4.988 4.988 4.988 4.988 4.988 4.988 4.988 4.988 4.988 4.988 4.988
2 0.078 0.30 0.30 0.70 0.70
5.387 5.312 5.338 4.463 4.675 4.275 4.238 3.562 3.175 3.925 4.950 4.762
6 0.241 0.30 0.60 0.70 0.40
3.700 3.200 2.738 2.325 1.250 0.975 1.175 1.950 2.488 3.613 3.987 3.950
7 0.357 0.30 0.60 0.70 0.40
1.212 1.125 1.050 0.950 0.663 0.488 0.425 0.512 0.637 0.900 1.112 1.188
8 0.031 0.30 0.70 0.70 0.30
0.225 0.213 0.200 0.175 0.200 0.213 0.375 0.887 0.975 0.512 0.262 0.262
10 0.022 0.30 0.80 0.70 0.20
0.712 0.700 0.738 0.550 0.513 0.688 0.613 0.600 0.850 0.812 0.800 0.775
60382 5
6 0.197 0.30 0.60 0.70 0.40
3.700 3.200 2.738 2.325 1.250 0.975 1.175 1.950 2.488 3.613 3.987 3.950
7 0.413 0.30 0.60 0.70 0.40
1.212 1.125 1.050 0.950 0.663 0.488 0.425 0.512 0.637 0.900 1.112 1.188
8 0.016 0.30 0.70 0.70 0.30
0.225 0.213 0.200 0.175 0.200 0.213 0.375 0.887 0.975 0.512 0.262 0.262
10 0.111 0.30 0.80 0.70 0.20
0.712 0.700 0.738 0.550 0.513 0.688 0.613 0.600 0.850 0.812 0.800 0.775
11 0.263 0.30 0.50 0.70 0.50
1.812 1.388 1.087 0.825 0.538 0.400 0.338 0.400 0.500 0.925 0.962 1.100
Run Code Online (Sandbox Code Playgroud)

我尝试使用熊猫read_csv读取它:

import pandas as pd
data = pd.read_csv('./myfile.txt',header=None,sep='\s')
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

ParserError: Expected 6 fields in line 3, saw 12. Error could possibly be due to quotes being ignored when a multi-char delimiter is used.
Run Code Online (Sandbox Code Playgroud)

因此,我的文件没有多字符定界符或引号。我已经尝试了在此论坛中找到的解决方案,建议使用:

data = pd.read_csv(open('./myfile.txt','r'), header=None,encoding='utf-8', engine='c')
Run Code Online (Sandbox Code Playgroud)

尽管这解决了上面的错误,但是我所看到的数组没有使用空格作为列的分隔符,并且输出只有1列:

数据输出

我应该如何读取文件以获取每个值的列?我不介意是否有nan值填充其余部分。

Una*_*iel 4

如果您已成功获取单列中的数据,则可以使用Series.str.split()来解决此问题。

以下是您提供的一些示例数据的示例(您可以使用任何字符串或正则表达式作为 中的分隔符split()):

df[0].str.split(' ', expand=True)

     0      1      2      3      4      5      6      7      8      9   \
0  0.270   0.30   0.30   0.70   0.70   None   None   None   None   None
1  4.988  4.988  4.988  4.988  4.988  4.988  4.988  4.988  4.988  4.988
Run Code Online (Sandbox Code Playgroud)

如果您这样做,那么您不妨使用pd.DataFrame(open(...).readlines())或类似的东西创建数据框,因为您根本无法从 中受益read_csv(),并且您的文件并不完全是标准的 csv 文件。

# f is a StringIO with some of your sample data to simulate a file
df = pd.DataFrame(line.strip().split(' ') for line in f)

       0      1      2      3      4      5      6      7      8      9   \
0   60381      6   None   None   None   None   None   None   None   None
1       1  0.270   0.30   0.30   0.70   0.70   None   None   None   None
2   4.988  4.988  4.988  4.988  4.988  4.988  4.988  4.988  4.988  4.988
3       2  0.078   0.30   0.30   0.70   0.70   None   None   None   None
4   5.387  5.312  5.338  4.463  4.675  4.275  4.238  3.562  3.175  3.925
Run Code Online (Sandbox Code Playgroud)

当然,您也可以通过确保每行包含相同数量的列来修复输入文件,这将解决问题ParserError