【问题标题】:Extracting information from txt file using python使用python从txt文件中提取信息
【发布时间】:2022-06-30 15:04:11
【问题描述】:

我有一个看起来像这样的 TXT 文件

ETP   474654 0|170122|160222|MXP|    14045.84|           |     4711.00|       0|      0|      0|      0|   4711|      0
BA6 91215257 1|310122|      |MXP|            |    9053.93|            |        |       |       |       |       |
TDO   301530 1|010222|      |MXP|            |     280.91|            |        |       |       |       |       |
ETP   475384 0|260122|250222|MXP|   198340.87|           |      917.70|       0|      0|      0|      0|    917|      0
ANC 91163164 2|290122|      |MXP|            |     200.66|            |        |       |       |       |       |
BA6 91215555 1|140222|      |MXP|            |  193278.06|            |        |       |       |       |       |
TDO   302435 1|150222|      |MXP|            |    3944.45|            |        |       |       |       |       |
ETP   481186 0|020422|020522|MXP|    53597.34|           |      184.08|       0|      0|    184|      0|      0|      0
ANC 91164671 2|120422|      |MXP|            |     324.32|            |        |       |       |       |       |
BA6 91217161 1|200422|      |MXP|            |   52027.16|            |        |       |       |       |       |
TDO   306773 1|210422|      |MXP|            |    1061.78|            |        |       |       |       |       |
ETP   481188 0|020422|020522|MXP|    82599.09|           |      275.29|       0|      0|    275|      0|      0|      0
BA6 91217159 1|200422|      |MXP|            |   80677.32|            |        |       |       |       |       |
TDO   306775 1|210422|      |MXP|            |    1646.48|            |        |       |       |       |       |
ETP   483241 0|020522|010622|MXP|   162587.22|           |    20367.05|       0|  20367|      0|      0|      0|      0
ANC 91165149 2|060522|      |MXP|            |    1930.81|            |        |       |       |       |       |
BA6 91217906 2|230522|      |MXP|            |  137083.58|            |        |       |       |       |       |
TDO   308497 1|240522|      |MXP|            |    3205.78|            |        |       |       |       |       |
ETP   485561 0|300522|290622|MXP|    43411.90|           |    43181.22|   43181|      0|      0|      0|      0|      0
ANC 91165759 2|020622|      |MXP|            |     230.68|            |        |       | 

我想提取包含 ETP 的每一行中的所有数据。
前 6 位数字是 ETP ID。
号码|170122|是一个日期。
号码|160222|是一个日期。
下一个值 |14045.84|值也应该显示出来。
如果有一个非 0 值,在这种情况下,下一个非 0 值是 |4711.00|它也应该显示出来。

它应该返回类似的东西

ETP 474654 | 170122 | 160222 | 14045.84 | 4711.00  

理想情况下,它应该格式化日期并看起来像这样

ETP 474654 | 17/01/22 | 16/02/22 | 14045.84 | 4711.00  

我是 python 新手,想知道这是否可行,是否有人可以指出正确的方向来解决这个问题。感谢您的帮助。

【问题讨论】:

  • 您是否已经尝试过?发生了什么特殊问题?
  • 您可能对csv 模块感兴趣
  • 第一个数字多于6位。

标签: python text data-extraction


【解决方案1】:

Python 允许您使用内置的open() 函数读取文件

https://docs.python.org/3/library/functions.html#open

然后您可以通过 for 循环逐行读取文件:

file = open("some_file.txt", 'r')
for line in file:
  ...

为了像你想要的那样格式化数据,你必须使用python的一些字符串格式化函数,即:

columns = line.split("|")

这将为您提供 | 之间的所有字符串的列表字符,所以第一行的第一个元素是:

ETP 474654 0

如果你想摆脱多个空格,你可以这样做

line = " ".join(line.split()) 在拆分之前,这会将整行拆分为单个单词,然后将它们重新连接成一个字符串,每个单词之间只有一个空格

你似乎在第一行有一个额外的列,所以你可以通过这样做来摆脱它

first_column = columns[0].split(" ")

将该列中的三个元素分开,然后将它们放回数组中

columns[0] = first_column[0] + " " + first_column[1]

摆脱不需要的第三项

然后要合并其余列,您可以使用循环附加到字符串

output_string = ""
for column in columns:
    if (column == ""):
        continue
    output_string += column + " | "

加

output_string = output_string.rstrip(" |")

为了摆脱额外的“ | ”你会在最后,这会给你留下类似你的示例输出的非格式化日期

【讨论】:

    【解决方案2】:

    首先,对不起,如果我的回答过于冗长,但考虑到您的这部分问题:

    我是 python 新手,想知道这是否可行,是否有人可以指出正确的方向来解决这个问题。感谢您的帮助。

    我假设你是一个初学者,并推荐一个可能会派上用场的工具。

    我建议您查看Pandas library,尤其是在文档和基本示例中开始使用。如果您之前没有在您的 python 包中安装它,只需在(基本)终端中运行命令:pip install pandas

    接下来的主要想法是创建一个数据框,以便您可以在脚本期间对其进行编辑和处理。然后就可以运行了

    import pandas as pd
    
    data_frame = pd.read_csv('yout-file-name.txt') 
    

    打开文件并创建数据框。从那里,您可以使用以下命令研究数据框的一些参数:

    print(data.shape)
    

    查看文件的大小或

    print(data.head(n=5))
    

    可视化它的第一行。有了这个有组织的数据框,Pandas 中有几个功能可以根据需要编辑您的内容,我对您的主要建议是使用

    data_frame = data_frame.transpose()
    

    然后运行循环以仅选择 ETP 列并编辑您的第三行 - 选择 ETP 的列后,您还可以再次转置数据以返回到列日期工作 - (您提到的日期与日期相关) 到所需的格式,只需在数字之间写上“/”,就像机制建议的 here.

    希望这个工具对你的工作有所帮助!

    【讨论】:

      【解决方案3】:

      感谢您的回答!不幸的是,正如我所说,我是 Python 新手,并且正在使用 Web 编译器。 Fourtunatly 我能找到一个更简单的解决方案,我有点惊讶没有人建议它,但话又说回来,也许你也是 python 的新手。

      file = open("data.txt", 'r')
      word = input("Escribe ETP y presiona enter:")
      s=" "
      count=1
      
      while(s):
       s=file.readline()
       L=s.split()
       if word in L:
               print("Linea:", count, ":",s)
       count+=1
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-23
        相关资源
        最近更新 更多