python中outside loop_python跳过for循环

我正在编写代码以查找经度和纬度,并计算点的一定半径内的距离,并将两个文件分开.

对于前5次迭代,程序运行良好,但是此后,程序不会通过内部for循环运行.我已经遍历了代码,它只是遍历了for循环.它似乎取决于我将可变半径设置为什么.如果radius较小,则将允许内部for循环的迭代次数减少.

恐怕这可能是我在文件中读取方式的问题.我相信在第5次迭代后,infile_2为空,但我不知道如何解决它.

def main():

global infile_1, infile_2

## import geocoded college dataset

infile_2 = open("university_FIPS.csv", "r")

## import great_lakes_sample

infile_1 = open("great_lakes_sample.csv", "r")

outfile_within_bound = open("great_lakes_blood_college", "w")

outfile_outside_bound = open("great_lakes_blood_NOcollege", "w")

inside_buffer_count = 0

outside_buffer_count = 0

global lat_1_index, long_1_index, lat_2_index, long_2_index

## set radius to desired length (in miles)

radius = 100

## when it is generalized, use this:

## radius = input_buffer_radius()

# create two subsets of blood drive data, one within

# radius of college, one outside

# skip header

n_1 = 0

for infile_1_line in infile_1:

infile_1_line = infile_1_line.strip().replace("\"", "").split(","),

infile_1_line = infile_1_line[0]

record_stored = False

# find index of lat_2, long_2

if( n_1 == 0 ):

lat_2_index = infile_1_line.index( "lat" )

long_2_index = infile_1_line.index( "long" )

infile_1_header_list = infile_1_line

# assign lat_2, long_2 latitude and longitude values

lat_2 = infile_1_line[ lat_2_index ]

long_2 = infile_1_line[ long_2_index ]

# skip header

if n_1 > 0:

print( "\n\nExamining Record:", n_1 )

try:

lat_2 = float( lat_2 )

long_2 = float( long_2 )

except ValueError:

print( "Value error, skipping record" )

continue

except TypeError:

print("Type error, skipping record" )

continue

print( "Coordinates for record:", lat_2, long_2)

# skip header

n_2 = 0

# WILL NOT ENTER LOOP ON THIRD ITERATION, it's dependent on radius, when radius is 100, it stops at n_1 = 6

if ( n_1 > 0):

print("\n\n\nbefore loop")

for infile_2_line in infile_2:

infile_2_line = infile_2_line.strip().split(",")

if ( n_2 == 0):

print( "in" )

# find index of lat_1, long_1, create header list

if( n_2 == 0 and n_1 == 1):

lat_1_index = infile_2_line.index("lat")

long_1_index = infile_2_line.index("long")

infile_2_header_list = infile_2_line

# creat headers for each outfile

write_to_csv( infile_1_header_list, outfile_within_bound )

write_to_csv( infile_1_header_list, outfile_outside_bound )

# assign values for lat_1, long_1, after header

if( n_2 > 0 ):

lat_1 = infile_2_line[ lat_1_index ]

long_1 = infile_2_line[ long_1_index ]

try:

lat_1 = float( lat_1 )

long_1 = float( long_1 )

value_error = False

except ValueError:

continue

except TypeError:

continue

dist = haversine_distance(lat_1, long_1, lat_2, long_2)

if( dist <= radius ):

print( "\nRecord", n_1, "is",

dist, "miles from", lat_1, long_1)

write_to_csv( infile_1_line, outfile_within_bound )

record_stored = True

print( "Record stored in outfile_inside_bound." )

print( "Moving to next record." )

inside_buffer_count += 1

break

n_2 += 1

if( record_stored == False):

print( "\nOutside buffer." )

write_to_csv( infile_1_line, outfile_outside_bound )

outside_buffer_count += 1

print( "Record stored in outfile_outside_bound." )

n_1 += 1

print("\nRecords within buffer:", inside_buffer_count, "\nRecords outside buffer:", outside_buffer_count)

infile_1.close()

infile_1.close()

outfile_within_bound.close()

outfile_outside_bound.close()

解决方法:

直接的答案是,当您在f样式循环中的for x中循环访问一个文件时,python实际上是在跟踪进入文件的距离.因此,如果您在到达断点之前对内部for循环进行了10次迭代,那么下次您尝试使用infile_2遍历文件时,您将在文件中开始10行!

听起来像是您的情况,到第三次迭代时,您已经读取了整个文件,因此infile_2迭代器将位于外部for循环的所有后续迭代中的文件末尾.最简单的解决方法是在内部for循环运行之前执行infile_2.seek(0).这将重新定位infile_2以再次查看文件的开头. ew …

一切都很好,但我想向您提出几点建议:

>打开文件时,将open(“ test.txt”,“ r”)用作f,如this SO post所示.这样做的好处是不必记住显式关闭文件,因为它在末尾隐式关闭.块.

>通常最好将文件读入列表,进行计算,然后将结果全部写入一个快照.这样可以使您的代码更加井井有条(也更易于阅读),还可以避免遇到诸如错误之类的错误.

为了说明这些策略,这里是我如何读取代码示例中的文件:

def main():

global infile_1, infile_2

with open("great_lakes_sample.csv", "r") as infile_1:

#List comprehension to format all of the lines correctly

infile1_lines = [line.strip().replace("\"", "").split(",") for line in infile_1]

with open("university_FIPS.csv", "r") as infile_2:

#List comprehension to format all of the lines correctly

infile2_lines = [line.strip().split(",") for line in infile_2]

#Both files are automatically closed when their respected with blocks end.

标签:continue,for-loop,python

来源: https://codeday.me/bug/20191119/2040113.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值