【问题标题】:Text file manipulation with Python使用 Python 处理文本文件
【发布时间】:2015-05-28 18:27:41
【问题描述】:

首先,我对 Python 很陌生。当我开始这样做时,它似乎很简单。但是,我完全不知所措。

我想获取一个包含多达 90k 个条目的文本文件,并将数据组放在由“;”分隔的单行上我的例子如下。请记住,数据组的大小各不相同。它们可以是两个条目,也可以是 100 个条目。

Raw Data

group1
data

group2
data
data
data

group3
data
data
data
data
data
data
data
data
data
data
data
data

group4
data
data

Formatted Data

group1;data;

group2;data;data;data;

group3;data;data;data;data;data;data;data;data;data;data;data;data;

group4;data;data;

【问题讨论】:

  • 而数据是基于...?而你尝试过......?
  • 在询问堆栈溢出问题时,最好发布您的代码尝试
  • 你试过什么?文本文件用于/来自什么?文件操作是您在编写 Python 或一般编程时学到的最后“基本”知识之一。当我了解 for 循环、while 循环、字典、列表、追加和一百万个其他方便的功能的细微差别时,我将它保存起来,这是经过 2-3 个月的研究、编码和创建 GUI 之后的。如果你真的想看看 www.codecademy.com
  • 将数据组放入列表中,并使用';'.join(group)从中创建单个字符串。
  • 嗨,B Gus,欢迎您!由于您是新手,您可能并不完全了解如何最好地使用 stackoverflow。值得记住的是,我们喜欢帮助,我们喜欢以投票的形式收集小奖励,我们喜欢分享和学习。对社区最有帮助的是通过可以轻松建立的尝试提出问题......它表明提出问题的人已经为他们的问题付出了努力,并且没有将这个慷慨的社区视为理所当然。暂时,祝你的问题好运,请回来!

标签: python text formatting


【解决方案1】:

尝试以下方法。 (未经测试……你可以通过调试学习一点python!)

创建python文件“parser.py”

import sys

f = open('filename.txt', 'r')

for line in f:
    txt = line.strip()
    if txt == '':
        sys.stdout.write('\n\n')
        sys.stdout.flush()
    sys.stdout.write( txt + ';')
    sys.stdout.flush()

f.close()

然后在 shell 中输入:

python parser.py > output.txt

看看 output.txt 是不是你想要的。

【讨论】:

  • 如果可以的话,我会支持更多。不错,简单而有效的示例,具有许多功能,可以让任何初学者都很忙:P open('filename.txt', 'r') 不是以只读方式打开文件吗?如果尝试覆盖/编辑同一个文件,OP 应该记住这一点。 docs.python.org/2/tutorial/inputoutput.html
  • @BiTinerary 我不希望任何初学者不小心覆盖他们的数据;)
  • 我也这么想,好电话。只是想说明这一点,因为当我第一次修改它时它混淆了我的调试。
【解决方案2】:

假设组以空行分隔,您可以使用以下单行:

>>> print "\n".join([item.replace('\n', ';') for item in open('file.txt').read().split('\n\n')])
group1;data
group2;data;data;data
group3;data;data;data;data;data;data;data;data;data;data;data;data
group4;data;data;

file.txt 包含在哪里

group1
data

group2
data
data
data

group3
data
data
data
data
data
data
data
data
data
data
data
data

group4
data
data

首先将文件内容 (open().read()) 拆分为空行 split('\n\n') 以生成块列表,然后在每个块中 [item ... for item in list] 将换行符替换为分号,最后打印所有块用换行符分隔"\n".join(list)

请注意,以上内容对于生产来说是不安全的,即您为交互式数据转换编写的代码,而不是在生产级脚本中。

【讨论】:

    【解决方案3】:

    你试过什么?文本文件用于/来自什么?文件操作是我计划学习的最后一个“基本”内容之一。当我了解 for 循环、while 循环、字典、列表、追加和一百万个其他方便的函数的细微差别时,我将其保存下来。顺便说一下,这是经过 2-3 个月的研究、编码和创建 GUI 之后的事情。

    这里有一些基本的建议。
    ';'.join(group) 会放一个“;”在每个组之间,有效地创建一个长(分号分隔)字符串

    group.replace("SPACE CHARACTER", ";") :这将用分号替换组内的任何空格或指定字符(如换行符)。

    还有很多其他方法,包括将 txt 文件加载到 python 脚本、.append() 函数、将组放入 listsdictionaries 或矩阵等。

    【讨论】:

      【解决方案4】:

      这些是我要解决的问题:

      from collections import defaultdict
      import codecs
      import csv
      
      res = defaultdict(list)
      cgroup = ''
      with codecs.open('tmp.txt',encoding='UTF-8') as f:
          for line in f:
              if line.startswith('group'):
                  cgroup = line.strip()
                  continue
              res[cgroup].append(line.strip())
      
      with codecs.open('out.txt','w',encoding='UTF-8') as f:
          w =  csv.writer(f, delimiter=';',quoting=csv.QUOTE_MINIMAL) 
          for k in res:
              w.writerow([k,]+ res[k])
      

      让我解释一下我为什么这样做,就像我所做的那样。首先,我使用编解码器模块通过编解码器显式打开数据文件,因为应该始终正确处理数据,而不是仅仅猜测它可能是什么。然后我使用了defaultdict, which has a nice documentation online,因为它更像pythonic,至少regarding to mr. hettinger。它是其中一种模式,如果你使用 python 就可以忘记它。

      至少,我使用csv-writer 来生成输出,因为编写 CSV 文件并不像人们想象的那么容易。并且为了能够满足正确的标准,或者只是为了将数据转换为正确的 csv 格式,最好使用许多眼睛所见的,而不是重新发明轮子。

      【讨论】:

        猜你喜欢
        • 2016-09-02
        • 2017-06-18
        • 2022-10-18
        • 2020-06-21
        • 2019-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-20
        相关资源
        最近更新 更多