文本文件的意外输出 - 正确清理行读取

时间:2016-05-13 14:45:24

标签: python text

我正在尝试使用非常基本的文本文件作为设置文件。三行以此顺序/格式重复,用于管理程序的某些设置/输入。文本文件如下:

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数组,在第三个中读取一个字符串数组。然后将它们传递给函数,并重复多次。

然而,发生了以下三件事:

  1. Int不转换,我得到TypeError
  2. 文本文件中的第一行被忽略,我得到行保留在平台
  3. 每行末尾的
  4. \n
  5. 我怀疑这些是相关的,因此只发布一个问题。

4 个答案:

答案 0 :(得分:1)

  1. 你不能在列表上调用int,你需要做一些像

    这样的列表理解

    rows_to_keep = [int(a)for f.readline()。split('#')]

  2. 您正在读取一行,然后从该文件中读取另一行。您应该进行某种切片(参见Python how to read N number of lines at a time)或在每三次迭代后使用三行调用函数。

  3. 使用.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)
  1. 您不需要(也不希望)f上的for循环,以及对readline的调用。你应该选择其中一个。
  2. 您需要使用f关闭f.close()
  3. 您无法将list转换为int,而是希望将list中的元素转换为int。这可以通过for循环完成。
  4. 您可能希望调用.strip来删除尾随换行符。