如果标识符不存在,如何读取行并移至下一行?

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