【问题标题】:How to separate columns of .txt file? .txt to .csv pandas script making all of the columns into one?如何分隔 .txt 文件的列? .txt 到 .csv 熊猫脚本将所有列合二为一?
【发布时间】:2020-10-30 16:26:32
【问题描述】:

我有一个如下所示的文本文件:

      UWI/API             WELLNAME             WELLNO              LABEL                OPER               PRODFM         SURFLAT     SURFLON      BOTLAT      BOTLON   PERFTOP PERFBASE     PERFSOURCE         WELL        WELL        WELL        WELL        WELL        WELL        WELL      SYM   
                                                                                                                                                                                                              ELEV_KB        TD      COMP_DATE   SPUD_DATE     INJLIQ      INJGAS      INJWTR           
49025000510000      CH039068            3-A                 03WC2NE01           STANOLIND O&G CO    603WLCK2               43.384316 -106.275540    0.000000    0.000000  1525.0  1815.0                         4847.00     1815.00  03/20/1925  01/01/1925        0.00   857224.00  6538652.00CO2-INJ 
49025000540000      CH036906A           8-A                 08WC2NE01           STANOLIND O&G CO                           43.383111 -106.278775    0.000000    0.000000     0.0     0.0                                     1842.00  10/07/1926  01/01/1926        0.00   757266.00  2287490.00CO2-INJ 
49025000550000      CH03906B            12-A                12WC2NE01           STANOLIND O&G CO    603WLCK                43.383171 -106.272200    0.000000    0.000000  1448.0  1703.0                         4896.00     1916.00  07/23/1924  01/01/1924        0.00  1157524.00  9007039.00CO2-INJ 
49025000550000                                                                                                                                                            1448.0  1451.0                                                                                                    
49025000550000                                                                                                                                                            1700.0  1703.0                                                                                                    
49025000580000      CH03906B            19-A                19WC2NE01           STANOLIND O&G CO                           43.380695 -106.280337    0.000000    0.000000     0.0     0.0                                     1833.00  08/27/1924  01/01/1924        0.00  3602831.00  8002146.00CO2-INJ 
49025000580000                                                                                                                                                            1565.0  1833.0                                                                                                    
49025000590000      CH03906B            23-AX               23WC2NE01           STANOLIND O&G CO    603WLCK2               43.380810 -106.273800    0.000000    0.000000  1842.0  1916.0                                     1927.00  10/19/1923  01/01/1923        0.00  2673371.00  9392905.00CO2-INJ 
49025000590000                                                                                                                                                               0.0     0.0                                                                

当我运行此代码时,输​​出会将第一行的所有内容放在一列中。我希望第一列是“UWI/API”,第二列是“WELLNAME”,等等...如您所见,数据不是用逗号分隔,而是用空格分隔。数据有点乱?它没有对齐。标头应该是“UWI/API”到“INJWTR”。

这是我的代码:

import pandas as pd

df = pd.read_csv(r'C:/Users/mmcintyre/Documents/Teresa CO2 Injectors_Spaces.txt',sep=r'\s{2,}')

df.to_csv(r'C:/Users/mmcintyre/Documents/Teresa.csv',index=None)

输出是这样的:https://sru365edu-my.sharepoint.com/:x:/g/personal/mam1064_sru_edu/Ebq0tpHveAJBu710UcDt82IB23gmRs6nNrTE-MtDUgkU6Q?e=byhjuL

我突出显示了位置不正确的行。我不确定这是否可以修复。

谢谢! 摩根

【问题讨论】:

  • 试试sep='\s+'
  • 看起来您也没有在 read_csv 函数中完全指定标题。请参阅此处了解更多信息stackoverflow.com/questions/21318865/…
  • 谢谢保罗!您是如何准确格式化该文本文件的?...我只需要它看起来像那样大声笑!我用你的建议替换了 sep 。至于标题,我应该把它放在我的代码中的什么地方?我把它放在 sep='\s+' 之前和之后,但由于某种原因我不断收到错误。对不起,我是新人!非常感谢您的帮助!
  • 出于某种原因,对于不包含这些单元格数据的 API 编号,perftop 和 perfbase 列的值以 wellname 和 wellno 结尾。

标签: python pandas csv export-to-csv


【解决方案1】:

这些数据似乎很难解析。我用一堆 csv 解析器尝试了一些设置,但我认为没有一种干净的方法来解析这种混乱的数据。我选择了肮脏的方法。如果您只需要此文件,以下应该可以工作,如果您需要定期执行此操作,我不保证这将始终干净地工作。

#! /usr/bin/env python

import csv

data = []

with open('Teresa CO2 Injectors_Spaces.TXT') as file_handler:

    header = file_handler.readline().strip().split()
    header2 = ['' for i in range(13)] + file_handler.readline().strip().split() + ['']

    data.append(header)
    data.append(header2)

    for row in file_handler.readlines():

        tempRow = []

        UWIAPI = row[0:20]
        WELLNAME = row[20:40]
        WELLNO = row[40:60]
        LABEL = row[60:80]
        OPER = row[80:100]
        PRODFM = row[100:120]
        SURFLAT = row[120:132]
        SURFLON = row[132:144]
        BOTLAT = row[144:156]
        BOTLON = row[156:168]
        PERFTOP = row[168:176]
        PERFBASE = row[176:184]
        PERFSOURCE = row[184:200]
        ELEV_KB = row[200:220]
        TD = row[218:228]
        COMP_DATE = row[228:240]
        SPUD_DATE = row[240:252]
        INJLIQ = row[252:264]
        INJGAS = row[264:276]
        INJWTR = row[276::]
        SYM = ''

        tempRow = [
            UWIAPI.strip(),
            WELLNAME.strip(),
            WELLNO.strip(),
            LABEL.strip(),
            OPER.strip(),
            PRODFM.strip(),
            SURFLAT.strip(),
            SURFLON.strip(),
            BOTLAT.strip(),
            BOTLON.strip(),
            PERFTOP.strip(),
            PERFBASE.strip(),
            PERFSOURCE.strip(),
            ELEV_KB.strip(),
            TD.strip(),
            COMP_DATE.strip(),
            SPUD_DATE.strip(),
            INJLIQ.strip(),
            INJGAS.strip(),
            INJWTR.strip(),
            SYM,
        ]

        data.append(tempRow)

with open('example.csv', 'w+') as fh:

    writer = csv.writer(fh, delimiter=',')

    for row in data:

        writer.writerow(row)

【讨论】:

  • 嗨@joshua.softaware.dev,你是如何确定行函数的范围的?我正在尝试添加更多列,但我不明白这是如何工作的。谢谢! :)
  • 您使用的输入文件似乎有数据在某个点之后用空格右填充,EX 第一列有 20 个字符,如果数据长度为 14 个字符,则用 6 个空格填充.每列的数量似乎不同,所以我只是手动计算每列的间距,在文件的每一行中选择一个范围(例如,对于 WELLNO,我从 40:60 或 char 41-60 做了一个 str 切片因为开始是零索引,结束是 1 索引)。然后用 str.strip() 修剪。切片示例在这里stackoverflow.com/questions/509211/understanding-slice-notation
猜你喜欢
  • 1970-01-01
  • 2022-11-23
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多