在读取txt文件时考虑将带有空格(国家名称)的名称作为多列



我试图将文本文件加载到Python中,但由于字符串中有多个单词的空格,它将每个单词视为单独的列。出了什么问题,我该怎么解决?

数据:

Name 2000–12 2012–13 2013–14 2012 2012 2012 2012 2012 2012 2012
Costa Rica 4.7 3.4 4.3 15.9 15.1 –5.3 –3.5 .. 4.5 49.4
Côte d’Ivoire 1.2 8.7 8.2 .. .. 2.0 –3.1 .. 1.3 39.0
Croatia 2.1 .. .. 18.9 9.3 –0.3 –4.7 .. 3.4 80.7
Cuba 5.8 .. .. .. .. .. .. .. .. ..
Curaçao .. .. .. .. .. .. .. .. .. ..
Cyprusb 2.6c .. .. 8.8c 3.9c –6.9 –6.3 113.3 2.4 ..
Czech Republic 3.3 .. .. 21.0 5.1 –2.4 –4.4 38.3 3.3 77.3
Denmark 0.6 .. .. 23.6 15.7 5.9 –2.0 50.6 2.4 74.6
Djibouti 3.5 .. .. .. .. .. .. .. 3.7 ..
Dominica 3.2 1.1 1.7 10.8 .. –11.5 –11.9 .. 1.4 97.4
Dominican Republic 5.6 2.5 3.9 9.2 .. –6.8 –2.9 .. 3.7 34.3
Ecuador 4.4 4.0 4.1 26.9 6.1 –0.2 .. .. 5.1 31.6
Egypt, Arab Rep. 4.9 1.8 2.3 13.0 0.0 –2.7 –10.6 .. 7.1 74.1

我已经试过了:

q3=pd.read_csv("E:DRISTIAQuestion2.txt",skiprows=2,encoding='unicode_escape',header=0,engine='python',skipinitialspace=True,delim_whitespace=True)
print(q3)
Name 2000–12 2012–13 2013–14  2012 2012.1 2012.2 2012.3 2012.4  
Costa          Rica     4.7     3.4     4.3  15.9   15.1   –5.3   –3.5     ..   
Côte       d’Ivoire     1.2     8.7     8.2    ..     ..    2.0   –3.1     ..   
Croatia         2.1      ..      ..    18.9   9.3   –0.3   –4.7     ..    3.4   
Cuba            5.8      ..      ..      ..    ..     ..     ..     ..     ..   
Curaçao          ..      ..      ..      ..    ..     ..     ..     ..     ..   
Cyprusb        2.6c      ..      ..    8.8c  3.9c   –6.9   –6.3  113.3    2.4   
Czech      Republic     3.3      ..      ..  21.0    5.1   –2.4   –4.4   38.3   
Denmark         0.6      ..      ..    23.6  15.7    5.9   –2.0   50.6    2.4   
Djibouti        3.5      ..      ..      ..    ..     ..     ..     ..    3.7   
Dominica        3.2     1.1     1.7    10.8    ..  –11.5  –11.9     ..    1.4   
Dominican  Republic     5.6     2.5     3.9   9.2     ..   –6.8   –2.9     ..   

注意在"Costa Rica"和Côte d'Ivoire"等被推入第一个数据列。我想让它们留在Name列。

所需输出:

Name       2000–12 2012–13 2013–14 2012 2012 2012 2012 2012 2012 2012
Costa Rica 4.7     3.4     4.3     15.9 15.1 –5.3 –3.5 ..   4.5  49.4

。国家名称的所有字符串应该落在名称列下。所有其他列都是常规的,不包含任何空格。

Pandasread_csv函数接受一个自定义分隔符sep,它可以是一个正则表达式。现在的任务是明确一个正则表达式,它只匹配一行中最后一个n-1空格,其中n是文件中的列数。

q3=pd.read_csv(
"Question2.txt", engine='python', skiprows=2, encoding='unicode_escape',
sep=r's+(?!S+(?:s+S+){10})')
print(q3)

正则表达式匹配空格(s+),但仅当(?!...)后面没有10个或更多个以空格分隔的列时。

您提供的示例数据似乎与您的代码期望的不完全匹配,但是在顶部添加了几行空行,我得到

Name 2000–12 2012–13  ... 2012.4 2012.5 2012.6
0           Costa Rica       4.7       3.4  ...     ..    4.5   49.4
1     Côte d’Ivoire       1.2       8.7  ...     ..    1.3   39.0
2              Croatia       2.1        ..  ...     ..    3.4   80.7
3                 Cuba       5.8        ..  ...     ..     ..     ..
4             Curaçao        ..        ..  ...     ..     ..     ..
5              Cyprusb      2.6c        ..  ...  113.3    2.4     ..
6       Czech Republic       3.3        ..  ...   38.3    3.3   77.3
7              Denmark       0.6        ..  ...   50.6    2.4   74.6
8             Djibouti       3.5        ..  ...     ..    3.7     ..
9             Dominica       3.2       1.1  ...     ..    1.4   97.4
10  Dominican Republic       5.6       2.5  ...     ..    3.7   34.3
11             Ecuador       4.4       4.0  ...     ..    5.1   31.6
12    Egypt, Arab Rep.       4.9       1.8  ...     ..    7.1   74.1
[13 rows x 11 columns]

(注意Unicode mojibake,因为encoding关键字参数有点奇怪。)

可能是你的第一个任务保存结果在一个不太愚蠢的格式,可能是适当的CSV(逗号分隔,引号周围的任何字段包含字面逗号;但是熊猫to_csv()会为你照顾这一切)。

顺便说一句,使用完整路径硬编码文件名可能会使脚本不那么有用。也许像我上面所做的那样,取出路径,并在存放输入文件的目录中运行脚本,或者(不太有用,但有时更实际)将相对路径放入子目录,并从相应的父目录运行脚本。

相关内容

  • 没有找到相关文章

最新更新