【问题标题】:How to export int to "txt" file and then at a later date be able to import them back as int 's如何将 int 导出到“txt”文件,然后在以后能够将它们作为 int 导入回来
【发布时间】:2019-10-01 18:28:58
【问题描述】:

导出数据:

num = 0

exportData = open("results_file.txt", "a")


while num < len(runs) - 1:
    exportData.write(str(runs[num]) + "\n")
    num = num + 1

exportData.close()

将数据导入新文件:

runs = []

num = 1

count = len(open("results_file.txt").readlines(  ))
print(count)

importData = open("results_file.txt", "r")
while num < count:
    runs.append(importData.read(num))
    print(importData.read(num))
    num = num + 1
importData.close()

我的目标是将整数数组导出到一个文件(我关心的可能不是 txt 文件),然后在以后将它们导入一个新文件并将它们作为整数使用(执行对它们进行数学运算)

我得到的错误(在第 28 行,我试图使用数组中的第一个数字进行数学计算): 第 28 行,在 if runs[num]

runs = []

num = 1

count = len(open("results_file.txt").readlines(  ))
print(count)

importData = open("results_file.txt", "r")
while num < count:
    runs.append(int(importData.read(num)))
    print(importData.read(num))
    num = num + 1
importData.close()

添加 int() 会返回此错误: ValueError: int() 以 10 为底的无效文字:'4\n1'

【问题讨论】:

  • 您应该在num = num + 1 附近的第二个脚本中遇到错误,这应该会为您提供可行的信息量;你那里有错误吗?
  • 只是一个建议 - 通常,如果你正在处理文件,你会想要使用 with 语句: with open("filename") as my_file: #do stuff with my_file 这可以确保如果有任何未处理的异常/其他错误,文件仍然会正确关闭。
  • @The_Moth 您可以更新您的问题以包含该错误吗? cmets 中的格式使其看起来不太可读。

标签: python


【解决方案1】:

您不是 pythonic,这里的许多答案也不是。所以,让我清理一下你的代码。

from ast import literal_eval

with open("results_file.txt", "a") as exportData:
    for run in runs:
        exportData.write(str(run) + "\n")

runs = []
with open("results_file.txt", "r") as importData:
    runs.extend([literal_eval(x) for x in importData])

我将逐行分解:

from ast import literal_eval 是将字符串解析为 python 对象的最安全方法。它比使用普通的旧 eval 更好,因为它不会运行任意代码。稍后我们将使用这个函数来读取数据。

with open(...) as ... 是打开文件的最佳方式。它包含单个范围内的文件对象并捕获错误。看这里:Pep 343

for ... in ... 你使用的 For 循环根本不是 pythonoic。 pythonic 方法是使用迭代器,无需计算行数并声明变量来跟踪...... python 对象跟踪自己。 (如果您需要柜台,我强烈建议您查找enumerate() Enumerate() in Python

exportData.write(str(run) + "\n") 唯一的变化是使用 pythonic for 循环不再需要索引 runs 列表。

runs = [] 我想你知道这是什么,但我必须在with 语句中声明它,因为如果with 语句抛出错误,而你要抓住它,runs 将是初始化。

我已经讨论过with 声明。

runs.extend([literal_eval(x) for x in importData]) 发生了两件事。 extend 将列表附加到列表中......很酷。这里更有趣的部分是列表理解。 Here's a tutorial on list comprehensions。一旦您对for 循环感到满意,列表理解就是下一个pythonic 步骤。为了进一步了解pythonic,这行也可以替换为:runs.extend(map(literal_eval, importData))

就是这样,9 行。愉快的黑客攻击。

【讨论】:

  • 哇!多谢。这真的很酷,看看代码可以简化多少。我希望有一天我能达到与你类似的 Python 启蒙水平。再次感谢。
  • python -c 'import this'
【解决方案2】:

您遇到的错误很可能是由于您尝试将字符串添加到整数。尝试做

runs = []

num = 1

count = len(open("results_file.txt").readlines(  ))
print(count)

importData = open("results_file.txt", "r")
while num < count:
    runs.append(int(importData.read(num)))
    print(importData.read(num))
    num = num + 1
importData.close()

【讨论】:

  • 这并没有解决问题:(我将收到的新错误消息添加到帖子中。
【解决方案3】:

您正在寻找的主要功能/工具是int()。例如:

>>> int('15')
15

>>> int('15') + 5
20

但您也可以通过不同的编码方式为自己省去一些真正的麻烦。例如,您不需要提前知道行数。您可以直接调用.readline(),直到它返回一个空字符串。或者甚至遍历文件,当它结束时,它会退出。

另一个技巧,这只是一个很好的做法,是使用上下文管理器打开文件。所以不是

file = open('myfile.txt')
for line in file:
    print(line)

你会这样做:

with open('myfile.txt') as file:
    for line in file:
        print(line)

后者的最大优势在于如果将始终确保file 正确关闭。这在写入文件时特别有用。

【讨论】:

  • 感谢 with 函数的反馈和读取 one 的行,但添加 int() 并没有解决我遇到的问题。
猜你喜欢
  • 1970-01-01
  • 2016-03-02
  • 2011-09-14
  • 1970-01-01
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
  • 2021-07-14
  • 2013-02-27
相关资源
最近更新 更多