我正在使用CSV文件,在该文件中我需要按属性消除一些数据。在代码中,我成功地消除了val [0] AK写入文件的过程。但是,如果小于200公顷,我需要查询val [2]。
我没有收到带有此代码的错误消息,但它没有查询出公顷数。
我已经以几种不同的方式调整了代码-我是新来的。我以前收到错误消息,例如无法将字符串转换为float ....解决了这个问题后,我不再收到任何错误消息-但没有得到所需的结果。
def write_files(lg_fire_data, combined):
# Want the first header
with open(lg_fire_data[0], 'r') as first:
combined.write(first.read())
for i in range(1, len(lg_fire_data)):
with open(lg_fire_data[i], 'r') as canada_vals:
next(canada_vals, None)
for val in canada_vals:
if val[0] != 'AK':
combined.write(val)
for val in canada_vals:
val[2] = float(val[2])
if val[2] >= 200:
combined.write(val)
我不再收到任何错误消息-但没有得到查询的数据。
我们非常感谢您的帮助...假设我认为这应该很简单。 :)
答案 0 :(得分:0)
首先,您忘记创建带有文件句柄的csv.reader
对象,因此您的第一个循环产生的是字符串而不是行。 val[0]
是字符。
然后,您将无法在迭代器上搜索两次,这是第二次使用该迭代器,并且第二个循环不执行任何操作。如果要执行2个循环,请将行的内容存储在list
import csv
for file in lg_fire_data:
with open(file, 'r') as f:
canada_vals = csv.reader(f,delimiter=',') # not sure of your csv delimiter
next(canada_vals, None) # read title
canada_vals = list(canada_vals) # create a list, so you can loop twice
# rest is okay
for val in canada_vals:
if val[0] != 'AK':
combined.write(val)
for val in canada_vals:
val[2] = float(val[2])
if val[2] >= 200:
combined.write(val)