2016-03-25 65 views
1

我試圖從大文本文件(大約3GB)中刪除不需要的字符。我試圖在整個文件中刪除不需要的前進和反斜槓。我想保留字之間的Tilde,它作爲分隔符。該文件格式是這樣的:Python清理數據

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 

我也必須刪除所有之前或波浪線除了去除前進和後退後的空行斜線**

謝謝您幫幫我!

+5

Python是矯枉過正這一點,那就拿,就像...五線! 'tr -d/\\ < dirty.txt > clean.txt' – Amadan

+0

我知道你的意思。如果我不需要,我不會使用python! – lsch91

+0

更新了新的需求:'tr -d/\\ clean.txt'。我不明白爲什麼你必須*使用Python,除非它是作業;和家庭作業通常不涉及3GB文件... – Amadan

回答

2

這樣的事情真的很簡單嗎? (我相信for line in f是一臺發電機。無論如何,這只是一次讀取一行)

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

UPDATE(OP也想「刪除所有之前或波浪線後的空行「

這將跳過其中波浪線是由空格前面的線條和更換向前和向後斜槓在休息:

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」的行,刪除斜槓並丟棄其他所有內容,表明這樣會更容易理解。

+0

I如果Tilde的任何一邊有空白或空白,就想要全行。 line.replace()方法是否也適用於這樣的線? O.P.P. \〜O.P.P。歌曲 – lsch91

+0

「null」是什麼意思?你不是在談論空字節'\ 0',就像在空終止的C字符串中那樣,是嗎?但是,是的,'string.replace()'將刪除您提供的任何字符或字符組合,並將其替換爲第二個參數 - 在本例中爲空字符串。如果你想在代字號之前或之後刪除空格,它會變得稍微複雜 – jDo

+0

@ lsch91我更新了我的答案 – jDo

2

簡單,只需使用str.replace()

注雙\\,這不是取代雙反斜線而是一個反斜槓逃逸其他

代碼:

​​

輸出:

['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'] 
+0

你如何做到這一點,而不讀取整個文件,任何其他解決方案(遍歷文件並寫出不知何故)?只是好奇。 – Bahrom

+2

我不會太熱衷於在內存中加載3GB字符串... – Amadan

+0

編輯:對不起,忘了提及一件事!某些行顯示如下: 巧克力〜 巧克力〜可可 〜中美洲 我也必須刪除所有之前或波浪線除了刪除向前後是空的線條和反斜槓 – lsch91

1

TR Y:

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') 

該代碼去除\ /和線起始或從輸入文件與蒂爾達~結束並寫入清洗的輸出文件。

根據輸入的文本,它會發出

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 
+0

我覺得這很好。我不太確定OP後面是什麼,但是如果他/她只想要包含兩個以波浪號分隔的單詞的行,則剝離行並查找開始或結束的代字號是要走的路 - 比尋找空白區更好就像我在做的一樣。 +1 – jDo