<p>只是为了提供一个不使用正则表达式的替代解决方案:</p>
<p>您还可以用纯Python解析文本文件。在某些情况下,这可能比一个相当复杂的正则表达式更容易维护</p>
<p>对于这种特定的格式,我们知道每行的第一个和最后一个数字都有特殊的含义。所以我会用<code>split</code>和<code>rsplit</code>来挑选它们</p>
<pre class="lang-py prettyprint-override"><code>import pandas as pd
from io import StringIO
s = """6 Rotterdam NLD Zuid-Holland 593321
19 Zaanstad NLD Noord-Holland 135621
214 Porto Alegre BRA Rio Grande do Sul 1314032
397 Lauro de Freitas BRA Bahia 109236
547 Dobric BGR Varna 100399
552 Bujumbura BDI Bujumbura 300000
554 Santiago de Chile CHL Santiago 4703954
626 al-Minya EGY al-Minya 201360
646 Santa Ana SLV Santa Ana 139389
762 Bahir Dar ETH Amhara 96140
123 Chicago 10000
222 New York 200000 """
data = []
for line in StringIO(s):
line = line.strip()
if not line:
continue
id_value, line = line.split(" ", 1)
city, population = line.rsplit(" ", 1)
data.append((id_value, city, population))
df = pd.DataFrame(data, columns=["id", "city", "population"])
df["id"] = pd.to_numeric(df["id"])
df["population"] = pd.to_numeric(df["population"])
print(df)
</code></pre>
<p>我没有做任何速度测量。不过,根据文件大小,速度可能根本不是问题。但即使是这样:我也会先使用这个脚本对数据进行预处理(并且只预处理一次),以便能够在不需要额外参数的情况下使用常规的old<code>pd.read_csv</code></p>