Просто чтобы предоставить альтернативное решение без использования регулярных выражений:
Вы также можете выполнить синтаксический анализ текстового файла в обычном Python. В некоторых случаях это может быть легче поддерживать, чем довольно сложное регулярное выражение.
Для этого конкретного формата c мы знаем, что первое и последнее число в каждой строке имеют особое значение. Поэтому я бы использовал split
и rsplit
, чтобы выбрать их.
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)
Я не делал никаких измерений скорости. Однако, в зависимости от размера файла, скорость может вообще не быть проблемой. Но даже если это так: я бы использовал этот сценарий для предварительной обработки данных сначала (и только один раз), чтобы иметь возможность использовать обычный старый pd.read_csv
без дополнительных аргументов.