如何使用页面清除制表符分隔的文件

时间:2017-01-27 18:24:49

标签: python file tab-delimited-text

我有一个与制表符分隔的文件,看起来与此类似:

01/17/2017 Display Warehouse Stocks of Material                                       1

Material            Plnt    SLoc    SL  BUn       Unrestricted     Transit/Transf.    In Quality Insp.      Restricted-Use             Blocked             Returns

1111            5252    7000        EA             20.000               0.000               0.000               0.000               0.000               0.000
2222            4646    7000        EA             30.000               0.000               0.000               0.000               0.000               0.000

1/17/2017 Display Warehouse Stocks of Material                                       2

Material            Plnt    SLoc    SL  BUn       Unrestricted     Transit/Transf.    In Quality Insp.      Restricted-Use             Blocked             Returns

3333            6060    6000        EA             20.000               0.000               0.000               0.000               0.000               0.000
4444            5252    6000        EA             10.000               0.000               0.000               0.000               0.000               0.000

正如您所看到的,此文件包含一定数量的数据后的页面 我需要清理数据以获得类似的内容:

Material            Plnt    SLoc    SL  BUn       Unrestricted     Transit/Transf.    In Quality Insp.      Restricted-Use             Blocked             Returns
1111            5252    7000        EA             20.000               0.000               0.000               0.000               0.000               0.000
2222            4646    7000        EA             30.000               0.000               0.000               0.000               0.000               0.000
3333            6060    6000        EA             20.000               0.000               0.000               0.000               0.000               0.000
4444            5252    6000        EA             10.000               0.000               0.000               0.000               0.000               0.000

我用python部分清理了文件。

def _cleanup(txtfile):
  file = open(txtfile, 'r+')
  lines = file.readlines()
  file.seek(0)
  for line in lines:
    if line.startswith((' ', '\tMaterial')) == False and line.startswith((' ', '\t')):
      file.write(line)
  file.truncate()
  file.close()
  return True


def _main():
  sample = 'sample.txt'
  print('Done' if _cleanup(sample) else 'Something is wrong')


_main()

脚本给我这个:

1111            5252    7000        EA             20.000               0.000               0.000               0.000               0.000               0.000
2222            4646    7000        EA             30.000               0.000               0.000               0.000               0.000               0.000
3333            6060    6000        EA             20.000               0.000               0.000               0.000               0.000               0.000
4444            5252    6000        EA             10.000               0.000               0.000               0.000               0.000               0.000

正如您所看到的,脚本会删除表格标题,这是我需要的东西。

我知道如果您知道另一种方式是受欢迎的话,这可能不是最好的选择!

这个的主要目的是将数据放在数据库表中,可能是我的方式不正确。

3 个答案:

答案 0 :(得分:0)

使用正则表达式...使用键“^ [0-9] {4}。*” - 没有引号。

^ - 行的开始
[0-9] - 任何数字
{4} - 重复4次 。* - 获取整行

应该这样做。

以下是如何从具有正则表达式的文件中读取的链接。 https://codereview.stackexchange.com/questions/40423/reading-from-text-file-with-regexmatch

答案 1 :(得分:0)

看来,如果该行非空并且其第一项是整数,那么您需要它;否则,不是。然后这段代码应该做你想要的。

>>> headerFound = False
>>> with open('sample.txt') as sample:
...     for line in sample.readlines():
...         line = line.strip()
...         if line:
...             items = line.split()
...             if items[0]=='Material' and not headerFound:
...                 print (items)
...                 headerFound = True
...                 continue
...             try:
...                 first = int(items[0])
...                 print (items)
...             except:
...                 pass
...             
['Material', 'Plnt', 'SLoc', 'SL', 'BUn', 'Unrestricted', 'Transit/Transf.', 'In', 'Quality', 'Insp.', 'Restricted-Use', 'Blocked', 'Returns']
['1111', '5252', '7000', 'EA', '20.000', '0.000', '0.000', '0.000', '0.000', '0.000']
['2222', '4646', '7000', 'EA', '30.000', '0.000', '0.000', '0.000', '0.000', '0.000']
['3333', '6060', '6000', 'EA', '20.000', '0.000', '0.000', '0.000', '0.000', '0.000']
['4444', '5252', '6000', 'EA', '10.000', '0.000', '0.000', '0.000', '0.000', '0.000']

Fancier版本当然是可能的。您可以检查斜线的外观以消除线条。您可以检查字母字符。

答案 2 :(得分:0)

IIUC,你缺少标题。在这种情况下,只需将标题行的第一次出现添加到输出文件

def _cleanup(txtfile):
  file = open(txtfile, 'r+')
  lines = file.readlines()
  file.seek(0)
  AddHeader=False
  for line in lines:
    if line.startswith(('\tMaterial'))==True  and AddHeader==False:
        file.write(line)
        AddHeader=True
    if line.startswith((' ', '\tMaterial')) == False and line.startswith((' ', '\t')):
      file.write(line)
  file.truncate()
  file.close()
  return True


def _main():
  sample = 'sample.txt'
  print('Done' if _cleanup(sample) else 'Something is wrong')


_main()

输出

Material            Plnt    SLoc    SL  BUn       Unrestricted     Transit/Transf.    In Quality Insp.      Restricted-Use             Blocked             Returns
1111            5252    7000        EA             20.000               0.000               0.000               0.000               0.000               0.000
2222            4646    7000        EA             30.000               0.000               0.000               0.000               0.000               0.000
3333            6060    6000        EA             20.000               0.000               0.000               0.000               0.000               0.000
4444            5252    6000        EA             10.000               0.000               0.000               0.000               0.000               0.000