Python 使用连续空格作为分隔符和缺少数据的ASCII表

Python 使用连续空格作为分隔符和缺少数据的ASCII表,python,pandas,ascii,whitespace,Python,Pandas,Ascii,Whitespace,我有一个庞大的ASCII数据表,其中有几个连续的空格作为分隔符,缺少的数据如下: 493802.2.38...9.................11... 5221.8.23.............7.........1. 1383782.51.............16.......1... 我需要和熊猫一起阅读如下:将第一个空白作为分隔符,而第二个空白列作为缺失数据 493802 |2 |38| |9| | | | | | | | |11| | 5221

我有一个庞大的ASCII数据表,其中有几个连续的空格作为分隔符,缺少的数据如下:

493802.2.38...9.................11...    
5221.8.23.............7.........1.    
1383782.51.............16.......1...   

我需要和熊猫一起阅读如下:将第一个空白作为分隔符,而第二个空白列作为缺失数据

493802 |2 |38| |9| | | | |  | | | |11| |
5221   |8 |23| | | | | | |7 | | | |  |1|
1383782|51|  | | | | | | |16| | | |1 | |
我试过了

df = pd.read_csv('file.txt', sep='\s+',header=None,engine='python')
但它将任何数量的空格视为分隔符,因此它只将文件解析为五列

并尝试

 df = pd.read_csv('file.txt', sep='\s',header=None,engine='python')
但它返回的错误是预期字段小于熊猫看到的字段


最后,我甚至尝试了一些其他参数,如引号或行终止符,但没有成功。有什么帮助吗?

如果我答对了,在您的文件中,“.”表示分隔和缺少的值

您可以将所有“..”替换为“,”,然后将剩余的“.”替换为“,”,并将逗号设置为分隔符;sep=','

根据你的例子,这对我很有用:

import io
import pandas as pd  

with open('file.txt','r') as file:
     content = file.read()

s2=content.replace('..',', ').replace('.',',')
df = pd.read_table(io.StringIO(s2),sep=',',header=None)

Note: Io is necessary so that pandas reads the text as a file 

如果我答对了,那么在您的文件中,“.”表示分隔和缺少的值

您可以将所有“..”替换为“,”,然后将剩余的“.”替换为“,”,并将逗号设置为分隔符;sep=','

根据你的例子,这对我很有用:

import io
import pandas as pd  

with open('file.txt','r') as file:
     content = file.read()

s2=content.replace('..',', ').replace('.',',')
df = pd.read_table(io.StringIO(s2),sep=',',header=None)

Note: Io is necessary so that pandas reads the text as a file 

如果我们使用regex模式
\s{2}|\s
作为分隔符,那么如果有两个空格,那么两个空格将优先匹配一个空格。因此,例如,用
\s{2}\s
拆分第一行将产生

In [33]: re.split(r'\s{2}|\s', '493802 2 38   9                 11   ')
Out[33]: ['493802', '2', '38', '', '9', '', '', '', '', '', '', '', '', '11', '', '']
请注意,三个空格作为两个分隔符背靠背匹配。从那以后 两个分隔符之间是空的,熊猫会为失踪者插入一个楠 价值:

屈服

     index   0     1   2    3   4   5   6     7    8   9  10   11    12   13
0   493802   2  38.0 NaN  9.0 NaN NaN NaN   NaN  NaN NaN NaN  NaN  11.0  NaN
1     5221   8  23.0 NaN  NaN NaN NaN NaN   NaN  7.0 NaN NaN  NaN   NaN  1.0
2  1383782  51   NaN NaN  NaN NaN NaN NaN  16.0  NaN NaN NaN  1.0   NaN  NaN

请注意,结果与您发布的结果略有不同。前两行匹配,但第三行不同。然而,我认为
\s{2}\s
可能是您正在寻找的正则表达式

如果我们使用正则表达式模式
\s{2}|\s
作为分隔符,那么如果有两个空格,那么两个空格将优先匹配一个空格。因此,例如,用
\s{2}\s
拆分第一行将产生

In [33]: re.split(r'\s{2}|\s', '493802 2 38   9                 11   ')
Out[33]: ['493802', '2', '38', '', '9', '', '', '', '', '', '', '', '', '11', '', '']
请注意,三个空格作为两个分隔符背靠背匹配。从那以后 两个分隔符之间是空的,熊猫会为失踪者插入一个楠 价值:

屈服

     index   0     1   2    3   4   5   6     7    8   9  10   11    12   13
0   493802   2  38.0 NaN  9.0 NaN NaN NaN   NaN  NaN NaN NaN  NaN  11.0  NaN
1     5221   8  23.0 NaN  NaN NaN NaN NaN   NaN  7.0 NaN NaN  NaN   NaN  1.0
2  1383782  51   NaN NaN  NaN NaN NaN NaN  16.0  NaN NaN NaN  1.0   NaN  NaN

请注意,结果与您发布的结果略有不同。前两行匹配,但第三行不同。然而,我认为
\s{2}\s
可能是您正在寻找的正则表达式

第二行的
23
7
之间有13个空格。在第三行,
51
16
之间有13个空格。既然
23
51
在不同的列中,那么
7和
16
不应该也在不同的列中吗?是的,你说得对,只是在第二行,
23
7
之间有13个空格。在第三行,
51
16
之间有13个空格。既然
23
51
在不同的列中,那么
7
16
不应该也在不同的列中吗?是的,你是对的,只是一个输入错误,它不断返回预期的行数小于熊猫看到的行数的错误。“saw 31第151行中预期有30个字段。错误可能是由于使用多字符分隔符时忽略了引号。”它不断返回预期行数小于saw的错误。“saw 31第151行中应包含30个字段。错误可能是因为使用多字符分隔符时忽略了引号。”原始文件中有空格而不是点,但是我尝试用点替换所有空格,然后应用答案,但仍然说找到的行少于预期在原始文件中没有空格,但我尝试用点替换所有空格,然后应用答案,但仍然说找到的行少于预期