【问题标题】:How information can be lost by reading and writing files in Python?在 Python 中读写文件是如何丢失信息的?
【发布时间】:2016-04-14 11:40:38
【问题描述】:

我有一个.sql 文件。我使用 Python 逐行读取它并将每一行保存在另一个文件中。因此,理论上输入和输出文件必须相同,但实际上输出文件比输入文件小 10 倍以上。我就是这样做的:

f = open('output.txt','w')
for line in file('input.sql'):
    line = line.replace('\n','')
    print >>f, line
f.close()

有人知道信息在哪个阶段丢失以及为什么丢失?

【问题讨论】:

  • @joelgoldstick,为什么你认为我的 *.sql 文件是一个 sqlite 文件?
  • 您是否检查了这两个文件的内容并发现了任何差异?而且我无法用您的代码重现问题
  • @LeiShi,我无法在文本编辑器中打开 *.sql 文件,因为它的大小约为 2G。 *.txt 文件大小约为 150M。我用文本编辑器打开它,看到一些 SQL 语句和我的数据。 *.txt 文件中的行数似乎还可以。
  • 我无法重现该问题 :( 而且,代码看起来很简单,“几乎”不会有任何误用。您可能会做的另一个尝试是使 input.sql 的头部和尾部达到峰值,并且将它们与 output.txt 中的相应部分进行比较,看看是否有任何错误。如果你在 linux bash 上,可以使用命令“head”和“tail”。
  • 找到原因了吗?

标签: python sql file input output


【解决方案1】:

dos 文件和 unix 文件之间存在一些内在差异。

其中一个区别是在 dos 文件中存在 ^M 字符,而在 unix 文件中不存在。

如果您使用的是 Linux 机器,您可以通过运行 cat -acat -steve 命令在文件中查看这些特殊字符。

例如,当用 cat -steve 分析 dos 格式(文件是在 Windows 操作系统中创建的)和 unix 格式的 Hi there$ 时,语句 Hi thereHi there^M$

尝试运行cat -steve <filename>

如果您的输入文件是 dos 文件,并且您正在 linux 机器中处理输出,则输出可能是 linux 格式的。自然,unix 文件比 dos 文件更紧凑。

编辑:您可以通过运行 dos2unix <file_name>unix2dos <file_name> 删除或强制文件中的 ^M 字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-21
    • 2016-07-20
    • 2020-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    相关资源
    最近更新 更多