如何解析txt文件没有明确的sep

2024-09-28 22:39:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在分析一个txt文件有一个已知的结构。 每一列代表一个国家,每一个值代表这个国家使用该名称的频率。你知道吗

关于源代码和原始文档here的更多信息—它被称为nam_dict.txt文件你知道吗

它看起来像这样:

M  Aadam                                          1                                   $
F  Aadje                                1                                             $
M  Ådne                      +                 1                                      $
M  Aadu                                           12                                  $
?F Aaf                                  1                                             $
F  Aafke                                4                                             $
?  Aafke                                 1                                            $
F  Aafkea                                1                                            $
M  Aafko                                1                                             $
M  Aage                                       761                                     $
M  Åge                       +                56                                      $
F  Aagje                              1 2                                             $

问题是数字之间没有分隔符,给定列的任何数字都可能有一个或两个数字(1到13)。有什么好办法提取这个吗?你知道吗

我想用Python和熊猫来做这个。你知道吗

列如下:

['GreatBritain',
 'Ireland',
 'U.S.A.',
 'Italy',
 'Malta',
 'Portugal',
 'Spain',
 'France',
 'Belgium',
 'Luxembourg',
 'theNetherlands',
 'EastFrisia',
 'Germany',
 'Austria',
 'Swiss',
 'Iceland',
 'Denmark',
 'Norway',
 'Sweden',
 'Finland',
 'Estonia',
 'Latvia',
 'Lithuania',
 'Poland',
 'CzechRepublic',
 'Slovakia',
 'Hungary',
 'Romania',
 'Bulgaria',
 'BosniaandHerzegovina',
 'Croatia',
 'Kosovo',
 'Macedonia',
 'Montenegro',
 'Serbia',
 'Slovenia',
 'Albania',
 'Greece',
 'Russia',
 'Belarus',
 'Moldova',
 'Ukraine',
 'Armenia',
 'Azerbaijan',
 'Georgia',
 'Kazakhstan/Uzbekistan,etc.',
 'Turkey',
 'Arabia/Persia',
 'Israel',
 'China',
 'India/SriLanka',
 'Japan',
 'Korea',
 'Vietnam',
 'othercountries']

希望得到这种类型的输出(在适当的情况下使用数字):

    gender  GreatBritain    Ireland U.S.A.  Italy   Malta   Portugal    Spain   France  Belgium ... Kazakhstan/Uzbekistan,etc.  Turkey  Arabia/Persia   Israel  China   India/SriLanka  Japan   Korea   Vietnam othercountries
name                                                                                    
Aad M   NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Aadam   M   NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Aadje   F   NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Ådne    M   NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
Aadu    M   NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

Tags: 文件txt代表数字国家nanirelanditaly
1条回答
网友
1楼 · 发布于 2024-09-28 22:39:12

空格可以组合: df = pd.read_csv(filename, sep="\s+")

例如,几个随后出现的空格将被视为单个分隔符。你知道吗

更新:似乎您应该使用read_fwf

>>> df = pd.read_fwf('nam_dict.txt', header=None, skiprows=362)
>>> df.head()
  0      1    2    3    4    5    6   7   8   9   10   11  12 13
0  M    Aad  NaN  NaN  NaN    4  NaN NaN NaN NaN NaN  NaN NaN  $
1  M  Aadam  NaN  NaN  NaN  NaN    1 NaN NaN NaN NaN  NaN NaN  $
2  F  Aadje  NaN  NaN  NaN    1  NaN NaN NaN NaN NaN  NaN NaN  $
3  M   Ådne    +  NaN  NaN  NaN    1 NaN NaN NaN NaN  NaN NaN  $
4  M   Aadu  NaN  NaN  NaN  NaN   12 NaN NaN NaN NaN  NaN NaN  $
>>> df.shape
(48528, 14)

Update2:必须生成列列表。第一列的宽度=1,第二列的宽度=27(直到+号),其余列的宽度设置为1。检查并修改(如需要):

>>> cols = [2, 27]
>>> cols.extend([1]*58)
>>> df = pd.read_fwf('nam_dict.txt', header=None, skiprows=362, widths=cols)
>>> df.head()
  0      1    2    3   4   5    6    7    8    9  ...   50  51   52  53  54  \
0  M    Aad  NaN  NaN NaN NaN  NaN  NaN  NaN  NaN ...  NaN NaN  NaN NaN NaN
1  M  Aadam  NaN  NaN NaN NaN  NaN  NaN  NaN  NaN ...  NaN NaN  NaN NaN NaN
2  F  Aadje  NaN  NaN NaN NaN  NaN  NaN  NaN  NaN ...  NaN NaN  NaN NaN NaN
3  M   Ådne    +  NaN NaN NaN  NaN  NaN  NaN  NaN ...  NaN NaN  NaN NaN NaN
4  M   Aadu  NaN  NaN NaN NaN  NaN  NaN  NaN  NaN ...  NaN NaN  NaN NaN NaN

    55   56  57  58 59
0  NaN  NaN NaN NaN  $
1  NaN  NaN NaN NaN  $
2  NaN  NaN NaN NaN  $
3  NaN  NaN NaN NaN  $
4  NaN  NaN NaN NaN  $

[5 rows x 60 columns]

相关问题 更多 >