Python清理数据

时间:2016-03-25 00:35:00

标签: python regex

我正在尝试从大文本文件中删除不需要的字符(大约3GB)。我正在尝试删除整个文件中不需要的前向和反斜杠。我希望将Tilde保留在单词之间,它充当分隔符。该文件的格式如下:

Cornet~Chris Tyle
Cornet\~Warren Vache
Cornet~Roger Webster
Cornet~\Grimethorpe Coll//iery Band
Cornet/~Daniel Rollston
Cornet~Murley Silver Band
Chocolate~Chocolate liquor
Chocolate~Theobroma cacao
Chocolate~Meso/america

所以在上面的例子中,我想删除所有后退/正斜杠,以便单词可读(同时保持波形符号)。我会使用Python Regex表达式吗?另一种可能性就是删除包含斜线的行,但我想把它留作最后的手段。

**编辑:抱歉忘了提一件事!有些行看起来像这样:

Chocolate~
Chocolate~Theobroma cacao
         ~Mesoamerica

除了删除前进和后退斜杠之外,我还必须删除Tilde之前或之后为null的所有行**

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

这样的事情真的很简单吗? (我相信for line in f是一个生成器。无论哪种方式,它一次只能读取一行)

with open(filename, "r") as f: 
     for line in f: 
         line = line.replace("/", "") 
         line = line.replace("\\", "")

更新(OP也希望"删除所有在Tilde之前或之后为空的所有行"

这将跳过波浪线以白色空格开头的行,并替换其余的前向和后退斜杠:

import re

pattern = re.compile(r'\s+~')

with open(filename, "r") as f: 
    for line in f: 
        if not pattern.match(line):
            line = line.replace("/", "") 
            line = line.replace("\\", "")
            print line

注意:如果您真正想要的只是保持所有行的格式为" word + tilde + word",请删除斜线并丢弃其他所有内容,说明这样会更容易理解。

答案 1 :(得分:2)

很简单,只需使用str.replace()即可。

注意双\\,它没有替换双反斜杠,而是一个反斜杠正在逃避另一个

<强>代码:

def clean():
    with open('example.txt', 'r') as f:
        outputs = []
        for line in f:
            output = line.replace('/', '')
            output = output.replace('\\', '')
            output = output.replace('\n', '')
            outputs.append(output)
    return outputs

print(clean())

<强>输出:

['Cornet~Chris Tyle', 'Cornet~Warren Vache', 'Cornet~Roger Webster', 'Cornet~Grimethorpe Colliery Band', 'Cornet~Daniel Rollston', 'Cornet~Murley Silver Band', 'Chocolate~Chocolate liquor', 'Chocolate~Theobroma cacao', 'Chocolate~Mesoamerica']

答案 2 :(得分:1)

尝试:

import re

rx = re.compile(ur'[/\\]+', re.MULTILINE)

inFile = "input.txt"
outFile = "output.txt"

with open(inFile, 'r') as f_in:
    with open(outFile,'w') as f_out:
        for line in f_in:
            cleanLine = re.sub(rx, '', line).strip()
            if cleanLine.startswith('~') or cleanLine.endswith('~'):
                continue
            f_out.write(cleanLine + '\n')

此代码正在从输入文件中删除\ /和从tilda ~开始或结束的行,并写入已清理的输出文件。

根据输入文字,它会发出

Cornet~Chris Tyle
Cornet~Warren Vache
Cornet~Roger Webster
Cornet~Grimethorpe Colliery Band
Cornet~Daniel Rollston
Cornet~Murley Silver Band
Chocolate~Chocolate liquor
Chocolate~Theobroma cacao
Chocolate~Mesoamerica
Chocolate~Theobroma cacao