Python 使用连续空格作为分隔符和缺少数据的ASCII表
我有一个庞大的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
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个字段。错误可能是因为使用多字符分隔符时忽略了引号。”原始文件中有空格而不是点,但是我尝试用点替换所有空格,然后应用答案,但仍然说找到的行少于预期在原始文件中没有空格,但我尝试用点替换所有空格,然后应用答案,但仍然说找到的行少于预期