Python 使用正则表达式分隔符读取csv
我一直在尝试读取如下自定义csv文件:Python 使用正则表达式分隔符读取csv,python,regex,pandas,Python,Regex,Pandas,我一直在尝试读取如下自定义csv文件: 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
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
我在伦敦试过regex
以下代码工作:
这很有效
#https://regex101.com/
s=“6鹿特丹全国民主联盟荷兰分会593321”
pat=r'(\d+)\s+([\d]+)\s(\d+)\s+'
m=重新匹配(帕特,s)
m、 组()#('6','Rotterdam NLD Zuid Holland','593321')
我得到了正确的答案,但当我将代码应用于pandas read_csv时,不知何故它无法工作
我的尝试
将numpy导入为np
作为pd进口熊猫
从io导入StringIO
s=“”6鹿特丹全国民主联盟荷兰分会593321
荷兰诺德扎恩斯塔德19号135621
南里奥格兰德港214号阿雷格里港1314032
397劳罗德弗雷塔斯布拉巴伊亚109236
547多布里克BGR瓦尔纳100399
552布琼布拉BDI布琼布拉300000
554智利圣地亚哥CHL圣地亚哥4703954
626 al Minya EGY al Minya 201360
646圣安娜SLV圣安娜139389
762 Bahir Dar ETH Amhara 96140
123芝加哥10000
222纽约200000“;
sep=r'(\d+)\s+|([\d]+)\s+|(\d+)\s+'
df=pd.read_csv(StringIO,sep=sep,engine='python')
df
我有很多NaN,如何只得到3列
列名为:ID城市人口
类似问题
如果每行开头只能有1、2或3位数字,请使用
sep = r'(?:(?<=^\d)|(?<=^\d{2})|(?<=^\d{3}))\s+|\s+(?=\S+\s*$)'
sep=r'(?:(?您使用模式匹配(提取)文本,但在pandas方法中,您使用模式进行拆分
如果每行开头只能有1、2或3位数字,请使用
sep = r'(?:(?<=^\d)|(?<=^\d{2})|(?<=^\d{3}))\s+|\s+(?=\S+\s*$)'
sep=r'(?:(?仅提供不使用正则表达式的替代解决方案:
您还可以用纯Python解析文本文件。在某些情况下,这可能比一个相当复杂的正则表达式更容易维护
对于这种特定的格式,我们知道每行的第一个和最后一个数字都有特殊的含义。因此,我会使用split
和rsplit
来选择它们
将熊猫作为pd导入
从io导入StringIO
s=“”6鹿特丹全国民主联盟荷兰分会593321
荷兰诺德扎恩斯塔德19号135621
南里奥格兰德港214号阿雷格里港1314032
397劳罗德弗雷塔斯布拉巴伊亚109236
547多布里克BGR瓦尔纳100399
552布琼布拉BDI布琼布拉300000
554智利圣地亚哥CHL圣地亚哥4703954
626 al Minya EGY al Minya 201360
646圣安娜SLV圣安娜139389
762 Bahir Dar ETH Amhara 96140
123芝加哥10000
222纽约200000
数据=[]
对于StringIO中的行:
line=line.strip()
如果不是直线:
持续
id_值,line=line.split(“,1)
城市,人口=line.rsplit(“,1)
数据追加((id_值、城市、人口))
df=pd.DataFrame(数据,列=[“id”,“city”,“population”])
df[“id”]=pd.to_numeric(df[“id”])
df[“总体”]=pd.to_numeric(df[“总体”])
打印(df)
我没有进行任何速度测量。但是,根据文件大小的不同,速度可能根本不是问题。但即使是这样,我也会先使用此脚本预处理数据(并且只进行一次)为了能够在不需要额外参数的情况下使用正则oldpd.read\u csv
。只是为了提供一种不使用正则表达式的替代解决方案:
您还可以用纯Python解析文本文件。在某些情况下,这可能比一个相当复杂的正则表达式更容易维护
对于这种特定的格式,我们知道每行的第一个和最后一个数字都有特殊的含义。因此,我会使用split
和rsplit
来选择它们
将熊猫作为pd导入
从io导入StringIO
s=“”6鹿特丹全国民主联盟荷兰分会593321
荷兰诺德扎恩斯塔德19号135621
南里奥格兰德港214号阿雷格里港1314032
397劳罗德弗雷塔斯布拉巴伊亚109236
547多布里克BGR瓦尔纳100399
552布琼布拉BDI布琼布拉300000
554智利圣地亚哥CHL圣地亚哥4703954
626 al Minya EGY al Minya 201360
646圣安娜SLV圣安娜139389
762 Bahir Dar ETH Amhara 96140
123芝加哥10000
222纽约200000
数据=[]
对于StringIO中的行:
line=line.strip()
如果不是直线:
持续
id_值,line=line.split(“,1)
城市,人口=line.rsplit(“,1)
数据追加((id_值、城市、人口))
df=pd.DataFrame(数据,列=[“id”,“city”,“population”])
df[“id”]=pd.to_numeric(df[“id”])
df[“总体”]=pd.to_numeric(df[“总体”])
打印(df)
我没有进行任何速度测量。但是,根据文件大小的不同,速度可能根本不是问题。但即使是这样,我也会先使用此脚本预处理数据(并且只进行一次)为了能够使用常规的oldpd.read_csv
而不需要额外的参数。您使用了模式来匹配(提取)文本,但在pandas方法中,您正在使用模式进行拆分。每行开头可以有多少位数字?@WiktorStribiżew我尝试了sep=r'(\d+)\s+([\d]+)\s+(\d+)\s+'
它只给出一列。如果每行开头只能有1、2或3位数字,请尝试sep=r'(?:(?@WiktorStribiżew该问题只是我数据集的一部分。现在,它对我的完整数据集有效,如果您作为答案发布,我将乐意接受作为答案。您使用了模式匹配(摘录)文本,但在pandas方法中,您正在使用模式拆分。每行开头可以有多少位?@WiktorStribiżew我尝试了sep=r'(\d+)\s+([\d]+)\s+(\d+)\s+”
它只给出一列。如果每行开头只能有1、2或3位数字,请尝试sep=r'(?:(?@WiktorStribiżew该问题只是我数据集的一部分。现在,它对我的完整数据集有效,如果你作为答案发布,我将乐意接受你的答案。