如果标识符不存在,如何读取行并移至下一行?
How to read line and move on to the next line if the identifiers are not present?
在下面的代码中,每当该行没有三个标识符时,我都会收到错误消息。如果文件中不存在标识符,我该如何跳过该行并移至下一行?如果第一行没有 mfgcode、modelno 和 qtyavail,则程序失败。谢谢你的时间。
import csv
import re
with open('file.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
ff = []
for line in csv_reader:
ff.append([re.search('mfgcode="(.+?)"', line[0] ).group(1),re.search('modelno="(.+?)"', line[0] ).group(1),re.search('qtyavail="(.+?)"', line[0] ).group(1)])
df = pd.DataFrame(ff,columns =['mfgcode','modelno','qtyavail'])
df.to_csv("test.csv",index=False)
print (df)
回溯:
line 10, in <module>
ff.append([re.search('mfgcode="(.+?)"', line[0] ).group(1),re.search('modelno="(.+?)"', line[0] ).group(1),re.search('qtyavail="(.+?)"', line[0] ).group(1)])
AttributeError: 'NoneType' object has no attribute 'group'
csvfile 的前三行:
<checkresp> <header errcode="success" errmsg="sucess" />
<part branch="1" core="0.00" cost="15.69" deliverytime="1" desc="" errcode="success" kit="" linecode="nike" linenum="1" list="23.42" mfgcode="nike" modelno="1221" qtyavail="120" qtyreq="1" uom="" />
</checkresp>
我认为Nambo的解决方案应该足够了。
但是,如果您想在没有 try-catch 的情况下执行此操作,请考虑是否存在其中一个标识符,然后也存在其他标识符,只搜索其中一个,如果搜索失败则继续-
mfgcode = re.search('mfgcode="(.+?)"', line[0])
if mfgcode:
ff.append([mfgcode.group(1),re.search('modelno="(.+?)"', line[0] ).group(1),re.search('qtyavail="(.+?)"', line[0] ).group(1)])
我仍然担心的一件事是line[0]
。确保它代表您需要的行。
您正在尝试将以下内容插入到列表中:
[re.search('mfgcode="(.+?)"', line[0] ).group(1),re.search('modelno="(.+?)"', line[0] ).group(1),re.search('qtyavail="(.+?)"', line[0] ).group(1)]
问题是,当 re.search
什么也没找到时,它 return 是 None
的一个对象。您正在尝试获取 re.search
结果的匹配组 1,但是当它什么也没找到时,它会引发异常,因为您无法获取 None
.
的第 1 组
当 re.search
确实找到匹配项时,它将 return 类型为 re.Match
的对象; this 是当你想获得匹配组 1 的搜索。请参阅下面的示例。
>>> import re
>>> a = re.search('a', 'b')
>>> type(a)
<class 'NoneType'>
>>> a = re.search('a', 'a')
>>> type(a)
<class 're.Match'>
>>>
将您的搜索语句移到要追加的数组之外可能会有所帮助。像这样:
ff = []
for line in csv_reader:
mfgcode = re.search('mfgcode="(.+?)"', line[0] )
modelno = re.search('modelno="(.+?)"', line[0] )
qtyavail = re.search('qtyavail="(.+?)"', line[0] )
ff.append(
[
'No Data' if mfgcode is None else mfgcode.group(1),
'No Data' if modelno is None else modelno.group(1),
'No Data' if qtyavail is None else qtyavail.group(1),
]
)
请注意,这使用 in-line if 语句,解释得很好 here。
在下面的代码中,每当该行没有三个标识符时,我都会收到错误消息。如果文件中不存在标识符,我该如何跳过该行并移至下一行?如果第一行没有 mfgcode、modelno 和 qtyavail,则程序失败。谢谢你的时间。
import csv
import re
with open('file.csv', 'r') as csv_file:
csv_reader = csv.reader(csv_file)
ff = []
for line in csv_reader:
ff.append([re.search('mfgcode="(.+?)"', line[0] ).group(1),re.search('modelno="(.+?)"', line[0] ).group(1),re.search('qtyavail="(.+?)"', line[0] ).group(1)])
df = pd.DataFrame(ff,columns =['mfgcode','modelno','qtyavail'])
df.to_csv("test.csv",index=False)
print (df)
回溯:
line 10, in <module>
ff.append([re.search('mfgcode="(.+?)"', line[0] ).group(1),re.search('modelno="(.+?)"', line[0] ).group(1),re.search('qtyavail="(.+?)"', line[0] ).group(1)])
AttributeError: 'NoneType' object has no attribute 'group'
csvfile 的前三行:
<checkresp> <header errcode="success" errmsg="sucess" />
<part branch="1" core="0.00" cost="15.69" deliverytime="1" desc="" errcode="success" kit="" linecode="nike" linenum="1" list="23.42" mfgcode="nike" modelno="1221" qtyavail="120" qtyreq="1" uom="" />
</checkresp>
我认为Nambo的解决方案应该足够了。
但是,如果您想在没有 try-catch 的情况下执行此操作,请考虑是否存在其中一个标识符,然后也存在其他标识符,只搜索其中一个,如果搜索失败则继续-
mfgcode = re.search('mfgcode="(.+?)"', line[0])
if mfgcode:
ff.append([mfgcode.group(1),re.search('modelno="(.+?)"', line[0] ).group(1),re.search('qtyavail="(.+?)"', line[0] ).group(1)])
我仍然担心的一件事是line[0]
。确保它代表您需要的行。
您正在尝试将以下内容插入到列表中:
[re.search('mfgcode="(.+?)"', line[0] ).group(1),re.search('modelno="(.+?)"', line[0] ).group(1),re.search('qtyavail="(.+?)"', line[0] ).group(1)]
问题是,当 re.search
什么也没找到时,它 return 是 None
的一个对象。您正在尝试获取 re.search
结果的匹配组 1,但是当它什么也没找到时,它会引发异常,因为您无法获取 None
.
当 re.search
确实找到匹配项时,它将 return 类型为 re.Match
的对象; this 是当你想获得匹配组 1 的搜索。请参阅下面的示例。
>>> import re
>>> a = re.search('a', 'b')
>>> type(a)
<class 'NoneType'>
>>> a = re.search('a', 'a')
>>> type(a)
<class 're.Match'>
>>>
将您的搜索语句移到要追加的数组之外可能会有所帮助。像这样:
ff = []
for line in csv_reader:
mfgcode = re.search('mfgcode="(.+?)"', line[0] )
modelno = re.search('modelno="(.+?)"', line[0] )
qtyavail = re.search('qtyavail="(.+?)"', line[0] )
ff.append(
[
'No Data' if mfgcode is None else mfgcode.group(1),
'No Data' if modelno is None else modelno.group(1),
'No Data' if qtyavail is None else qtyavail.group(1),
]
)
请注意,这使用 in-line if 语句,解释得很好 here。