我正在尝试使用非常基本的文本文件作为设置文件。三行以此顺序/格式重复,用于管理程序的某些设置/输入。文本文件如下:
Facebook
1#3#5#2
Header1#Header2#Header3#Header4
...
使用以下Python代码阅读:
f = open('settings.txt', 'r')
for row in f:
platform = f.readline()
rows_to_keep = int(f.readline().split('#'))
row_headers = f.readline().split('#')
clean_output(rows_to_keep, row_headers, platform)
我希望在平台中读取单个字符串,在第二个中读取一个int数组,在第三个中读取一个字符串数组。然后将它们传递给函数,并重复多次。
然而,发生了以下三件事:
TypeError
\n
我怀疑这些是相关的,因此只发布一个问题。
答案 0 :(得分:1)
你不能在列表上调用int,你需要做一些像
这样的列表理解rows_to_keep = [int(a)for f.readline()。split('#')]
您正在读取一行,然后从该文件中读取另一行。您应该进行某种切片(参见Python how to read N number of lines at a time)或在每三次迭代后使用三行调用函数。
使用.strip()
删除行尾和其他空格。
答案 1 :(得分:1)
试试这个:
with open('settings.txt', 'r') as f:
platform, rows_to_keep, row_headers = f.read().splitlines()
rows_to_keep = [int(x) for x in rows_to_keep.split('#')]
row_headers = row_headers.split('#')
clean_output(rows_to_keep, row_headers, platform)
答案 2 :(得分:0)
这里有几件事情。首先,当您在第二行进行拆分时,您尝试将list
转换为int
类型。那不行。相反,您可以使用map
。
rows_to_keep = map(int,f.readline().strip().split("#"))
此外,您还可以看到上面的strip()
方法。这会从您的行中删除尾随的空格字符,即:\n
。
尝试更改,并在每次strip()
来电时使用readline()
。
答案 3 :(得分:0)
尽可能少的更改,我试图解决您的问题,并告诉您出错的地方。 @ Daniel的回答是我个人如何解决问题。
f = open('settings.txt', 'r')
#See 1. We remove the unnecessary for loop
platform = f.readline()
#See 4. We make sure there are no unwanted leading or trailing characters by stripping them out
rows_to_keep = f.readline().strip().split('#')
#See 3. The enumerate function creates a list of pairs [index, value]
for row in enumerate(rows_to_keep):
rows_to_keep[row[0]] = int(row[1])
row_headers = f.readline().strip().split('#')
#See 2. We close the file when we're done reading
f.close()
clean_output(rows_to_keep, row_headers, platform)
f
上的for循环,以及对readline的调用。你应该选择其中一个。f
关闭f.close()
。list
转换为int
,而是希望将list
中的元素转换为int
。这可以通过for
循环完成。.strip
来删除尾随换行符。