【问题标题】:How to format txt file in Python如何在 Python 中格式化 txt 文件
【发布时间】:2020-01-20 10:46:23
【问题描述】:

我正在尝试将 txt 文件转换为 Python 中的 csv 文件。 txt 文件的当前格式是由空格分隔的几个字符串。我想将每个字符串写入 csv 文件中的一个单元格。

txt文件的结构如下:

用户 ID 桌面显示(版本)(服务器/端口句柄),日期

用户 ID 桌面显示(版本)(服务器/端口句柄),日期

等等

我的方法如下:

with open('licfile.txt', "r+") as in_file:
    stripped = (line.strip() for line in in_file)
    lines = (line.split(" ") for line in stripped if line)

with open('licfile.csv', 'w') as out_file:
    writer = csv.writer(out_file)
    writer.writerow(('user', 'desktop', 'display', 'version', 'server', 'handle', 'date'))
    writer.writerows(lines)

不幸的是,这没有按预期工作。我确实收到以下 ValueError: I/O operation on closed file。此外,在 csv 文件的一个单元格中仅显示预期的行标题。

关于如何进行的任何提示?非常感谢。

【问题讨论】:

  • 能否添加输入和预期输出示例?
  • 您应该包括脚本的输入和输出(或其中的一部分)。
  • 只需在stripped = (line.strip() for line in in_file) 之前使用read_lines = in_file.readlines() 来读取缓冲区中的行,然后再遍历它们。否则,代码的逻辑似乎已经足够好了。

标签: python python-3.x csv formatting format


【解决方案1】:
licfile_df = pd.read_csv('licfile.txt',sep=",", header=None)

【讨论】:

  • @shaikmoed 我认为存在一些误解 - 空格是源文件中的分隔符。目标文件应该是 csv,按照标准,它通常以逗号分隔。 AFAIU 这实际上是整篇文章的主要转换......
  • 使用 pandas 很容易将文本文件转换为 DataFrame 和 sep="," 用于如果您的文本文件用逗号分隔,它会根据您的文本文件而有所不同。
  • 是的,从可用性的角度来看,这很容易纠正。但一方面,对于像这样的简单任务来说,它可能有点太重了,然后这篇文章根本没有用 pandas 标记......
【解决方案2】:

怎么样

with open('licfile.txt', 'r') as in_file, open('licfile.csv', 'w') as out_file:
    for line in in_file:
        if line.strip():
            out_file.write(line.strip().replace(' ', ',') + '\n')

对于德国 Excel 爱好者...

...
    ...
        ...
            ... .replace(' ', ';') + '\n')

:)

【讨论】:

  • 感谢您的提示。此解决方案至少将数据写入 csv 但不幸的是将所有内容写入一列,我想将每条记录与其他记录分开。
  • 按栏目你是怎么理解的?它将逗号放在之前有空格的所有条目之间。如果您通过 what-is-put-in-different-columns-when-I-load-that-c​​sv-with-Excel 定义 column 那么您应该看看Excel 用作列分隔符的内容。你在德国?试试;...
  • 是的(不仅如此,而且)在德国,标准的十进制符号是逗号,不幸的是,它与用作列分隔符的字符完全相同 - 好吧,逗号分隔值 - 文件。因此,列分隔符在这里是一个分号。这是一般软件的区域设置首选项主题的一部分。
  • 您猜对了,感谢您的解释。现在,如果我在 txt 文件中有几行具有等效列,我可以简单地在每个日期之后添加一个新行吗?
  • 是的,所有记录都打印在一行中,但我希望文本文件中的每个条目都有一行。
【解决方案3】:

您正在使用带有圆括号的理解,这将导致创建元组对象。而不是只使用方括号将返回列表。看下面的例子:

stripped = [line.strip() for line in in_file]
lines = [line.split(" ") for line in stripped if line]

【讨论】:

  • 不抱歉,但这完全是错误的。带有 for 表达式的圆括号会生成生成器,而不是元组。即使 OP 可能是偶然做到的,但这不是 imo 的问题......
【解决方案4】:

您也可以使用内置的csv 模块轻松完成此操作:

import csv

with open('licfile.txt', 'r') as in_file, open('licfile.csv', 'w') as out_file:
    reader = csv.reader(in_file, delimiter=" ")  
    writer = csv.writer(out_file, lineterminator='\n')
    writer.writerows(reader)

我在这里使用了lineterminator='\n' 参数,因为默认值为\r\n,在大多数情况下,它最终会为您提供每行额外的返回行。

如果需要引用或需要不同的分隔符,您还可以使用一些参数:https://docs.python.org/3/library/csv.html#csv-fmt-params

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多