我正在尝试在邮件列表中找到具有特定邮政编码的条目(CSV格式)。 我认为这应该有用,但它永远找不到任何东西,尽管我知道所寻求的邮政编码就在那里。
text = open("during1.txt","r")
a = list(range(93201,93399))
b = list(range(93529,93535))
c = list(range(93601,93899))
d = list(range(95301,95399))
KFCFzip = a+b+c+d
output = open("output.txt","w")
for line in text:
array= line.strip().split(",")
print(array[6][0:5])
if array[6][0:5] in KFCFzip:
#output.write(array)
print("yes")
text.close()
output.close()
当我运行代码时,它找不到匹配项,但是IF语句上面的print语句打印出看起来应该匹配的值,当我转到Shell并键入类似
的内容时93701 in KFCFzip
它让我回到了“真:所以它在那个程度上起作用。文件只是用逗号分隔的文本,所以我无法弄清楚为什么它可以看到它们。 数据文件包含实时数据,因此我必须在发布之前稍微更改一下。我想知道是否有人有任何想法不涉及发布数据本身。
答案 0 :(得分:7)
因为array[6][0:5]
是字符串。在查看KFCFzip
列表之前,您应该将其转换为整数。
for line in text:
array= line.strip().split(",")
print(array[6][0:5])
if int(array[6][0:5]) in KFCFzip:
print("yes")
此解决方案的另一个问题是性能。 range
创建一个元素列表,以便您将每个“可疑”邮政编码与每个可能的邮政编码进行比较。此算法的时间复杂度为O(n*m)
,其中n = len(KFCFzip)
和m - 文件中的行数。更好的方法是创建一个范围列表,如:
KFCFzip = [[93201,93399], [93529,93535], [93601,93899], [95301,95399]]
for line in text:
array= line.strip().split(",")
zip = int(array[6][0:5]))
print(zip)
found = False
for r in KFCFzip:
if zip >= r[0] and zip < r[1]:
found = True
break
if found:
print("yes")
在这种情况下,你可以大大提高性能。
例如,使用您的数据时,您会有197+5+297+97 = 596
个元素,因此对于每一行,您必须平均进行596/2 = 298
次比较。但是使用我的算法,你只会进行8/2 = 4
次比较,这比较少75次(读得更快)。
答案 1 :(得分:2)
您应该使用csv
模块。你这样做的方式,如果你文件中的一个字段包含一个逗号,你就搞砸了。
此外,您不应隐藏内置名称,例如zip
。命名变量 array
似乎是错误的:首先,它指的是list
,而不是array
。它们不是同一件事。其次,变量名称应该反映它们引用的内容,而不仅仅是它们所引用的类型。
import csv
KFCFzip = [[93201,93399], [93529,93535], [93601,93899], [95301,95399]]
with open('addresses.csv', 'r') as addressfile:
for address in csv.reader(addressfile):
zipcode = int(address[6][0:5])
for lower, upper in KFCFzip:
if lower <= zipcode < upper:
print('yes')
break
else:
print('no')
答案 2 :(得分:1)
这可能是字符串与整数的问题。尝试通知你的array[6][0:5]
或字符串。