我有一个与制表符分隔的文件,看起来与此类似:
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
正如您所看到的,脚本会删除表格标题,这是我需要的东西。
我知道如果您知道另一种方式是受欢迎的话,这可能不是最好的选择!
这个的主要目的是将数据放在数据库表中,可能是我的方式不正确。
答案 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