Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用正则表达式分隔符读取csv_Python_Regex_Pandas - Fatal编程技术网

Python 使用正则表达式分隔符读取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

我一直在尝试读取如下自定义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 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城市人口

类似问题
您使用模式匹配(提取)文本,但在pandas方法中,您使用模式进行拆分


如果每行开头只能有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)

我没有进行任何速度测量。但是,根据文件大小的不同,速度可能根本不是问题。但即使是这样,我也会先使用此脚本预处理数据(并且只进行一次)为了能够在不需要额外参数的情况下使用正则old
pd.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)

我没有进行任何速度测量。但是,根据文件大小的不同,速度可能根本不是问题。但即使是这样,我也会先使用此脚本预处理数据(并且只进行一次)为了能够使用常规的old
pd.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该问题只是我数据集的一部分。现在,它对我的完整数据集有效,如果你作为答案发布,我将乐意接受你的答案。