readline在for循环中跳过第一行

-2 投票
1 回答
2240 浏览
提问于 2025-04-29 00:51

我遇到了一个问题,关于一个for循环,它跳过了第一行。我知道为什么会这样,但我不知道该怎么解决。而且当我把它改成while循环,或者其他任何类型的循环时,都会出现错误:

line 29, in <module>
    worksheet.write(row, col, float(b))
ValueError: could not convert string to float: 

代码是:

import xlsxwriter
import tkinter

file_list = []
x = 1
while x <= 30:
    file_list.append('AuF7_PATP 10_5M_MgF2_20µl_1s_S' + str(x) + '_calibrated.txt')
    x+=1
workbook = xlsxwriter.Workbook(file_list[0]+'.xlsx')
worksheet = workbook.add_worksheet()

row = 1
col = 0
f = open(file_list[0], 'r')
for line in f:
    a = f.readline()
    b = a[0:(a.rfind("\t"))]
    c = a[(a.rfind("\t")):-1]
    worksheet.write(row, col, float(b))
    worksheet.write(row, col + 1, float(c))
    row += 1
暂无标签

1 个回答

4

循环读取文件的时候,实际上已经在读取每一行了。你不需要再调用一次 f.readline()。你已经把这一行存储在 line 里了,所以直接用它就可以了。

另外,你的数据看起来是用制表符分隔的;可以考虑使用 csv 模块 来分割你的行;这个模块还能帮你把数据转换成浮点数:

reader = csv.reader(f, delimiter='\t', quoting=csv.QUOTE_NONNUMERIC)
for row, (b, c) in enumerate(reader, 1):
    worksheet.write(row, 0, b)
    worksheet.write(row, 1, c)

上面的例子使用了 enumerate(),这样可以为每一行数据提供一个计数器。csv.QUOTE_NONNUMERIC 这个选项会让输入文件中没有引号的内容自动转换成 float 对象。

撰写回答