前言
我已经有一段时间没有使用 python 了,所以我在数据清理方面遇到了问题。 在 Notepad++ 中,它运行得非常慢,所以我正在寻找Python中更有效的选项。
我需要什么
我需要清理一个目录中的 100 多个文件,所有这些文件都是从 SAP 手动提取的。
我正在寻找的步骤:
- 删除第一行
-----
- 删除第三行
-----
- 删除每行的第一个和最后一个字符
|
- 删除需要的空白 - 我需要保留文本之间的空白
原始文件
---------------------------------------------------------------------------
| MANDT|BUKRS|NETWR |UMSKS|UMSKZ|AUGDT |AUGBL|ZUONR |
---------------------------------------------------------------------------
| 100 |1000 |23.321- | | | | |TEXT I WANT TO KEEP|
| 100 |1000 |0.12 | | | | |TEXT I WANT TO KEEP|
| 100 |1500 |90 | | | | |TEXT I WANT TO KEEP|
---------------------------------------------------------------------------
预期结果
MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR
100|1000|23.321-|||||TEXT I WANT TO KEEP
100|1000|0.12|||||TEXT I WANT TO KEEP
100|1500|90|||||TEXT I WANT TO KEEP
<小时/>
代码here是我正在尝试处理的问题,但我需要正则表达式组合方面的帮助。在 Notepad++ 中,我可以使用 \h+(\w+)\h+
并替换 \1
但在这里它不起作用。请帮助我构建一个正确的正则表达式。
最佳答案
两种方法:
-- 使用内置 str
对象函数:
with open('yourfile.txt', 'r') as f:
lines = f.read().splitlines() # getting list of lines
for l in lines:
if not l.startswith('---'): # skip dashed lines
print('|'.join(map(str.strip, l.strip('|').split('|'))))
<小时/>
--使用re.sub()
函数:
with open('yourfile.txt', 'r') as f:
lines = f.read().splitlines()
for l in lines:
if not l.startswith('---'):
print(re.sub(r'\|\s*|\s*\|', '|', l).strip('|'))
# an auxiliary pattern for complex cases:
# re.sub(r'\|\s*(\S*)\s*(?=\|)', '|\\1', l).strip('|')
<小时/>
输出:
MANDT|BUKRS|NETWR|UMSKS|UMSKZ|AUGDT|AUGBL|ZUONR
100|1000|23.321-|||||TEXT I WANT TO KEEP
100|1000|0.12|||||TEXT I WANT TO KEEP
100|1500|90|||||TEXT I WANT TO KEEP
<小时/>
读/写模式:
要使用新内容覆盖当前文件,请使用以下方法:
with open('yourfile.txt', 'r+') as f: # 'r+' - read/write mode
lines = f.read().splitlines()
f.seek(0) # reset file pointer
f.truncate() # truncating file contents
for l in lines:
if not l.startswith('---'):
# or f.write('|'.join(map(str.strip, l.strip('|').split('|'))) + '\n')
f.write(re.sub(r'\|\s*|\s*\|', '|', l).strip('|') + '\n')
关于Python多个正则表达式清理文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46060337/