2011-12-09 136 views
0

我正在嘗試讀取所有大寫或全小寫的文件的所有行。閱讀.txt中全部大寫或全小寫Python 2.7.1的所有行?

如果file.txt包含:

Rememberr 8? when you 
. Tellingmee THAT one 
didntrememberthat 
onethingtoday 

我希望它讀:

didntrememberthat 
ONETHINGTODAY 

到目前爲止,我有:

def function(file_name): 
    data=[] 
    f=open(file_name,'r') 
    lines=f.readlines() 
    for k in lines: 
     single=tuple(k) 
     for j in single: 
      j=str(j) 
      if j.isupper() or j.islower() == False: 
      lines=f.readlines()[j:] 

然後我得到這樣的:

lines=f.readlines()[j:] 
TypeError: slice indices must be integers or None or have an __index__ method 

這是有道理的,因爲j不是整數。但是如何在j遇到if -statement時找到位置?

如果有一個更簡單的方法來做到這一點,這將是真棒

+0

什麼是'in_file'? –

+1

你真的想'onethingtoday'轉換爲全部大寫? –

+0

@ Marcelos。它應該是f而不是in_file。我改變了它。我將用腳本讀取的文件將全部位於上部或全部下部 –

回答

2
def homogeneous_lines (file_name): 
    with open(file_name) as fd: 
     for line in fd: 
      if line.islower() or line.isupper(): 
       yield line 

該功能通過讀取文件中的每一行。然後爲每一行檢查行是否全部大寫或小寫。

最後我們得到線。

編輯 - 更改爲使用與語句合併,使用內置islower()和isupper()字符串,並將其製作爲生成器。

+3

您可以使用'c.islower()'而不是'c == c.lower()'。如果你使用'with'打開文件,並使該函數成爲一個生成器,那麼你可以從我這裏得到一個贊成票。 –

+2

你應該在使用它後關閉文件。你正在重新實現'line.islower()'和'line.isupper()'=) – moooeeeep

+0

@BjörnPollex修正我相信。納入更改並製作成發電機。謝謝。 – ptc

5

你所得到的錯誤,因爲j是一個字符串,而不是一個整數(你不必調用str(j),順便說一下,它已經是一個字符串)。

你可以刪除線,大寫和小寫的像這樣的組合:

all_one_case = [ line 
       for line in f.readlines() 
       if line.isupper() or line.islower() ] 

注意:信用卡的使用isupper()islower()去一些其他的答案(使用re原)。對這個問題。

這也包括例如10 green bottles,因爲它只包含小寫字母,即使它也包含數字和空格。從這個問題來看,我無法分辨這是否是意圖。如果要替換這些行文件

   … if re.match('[A-Z]*$|[a-z]*$', line) ] 

,您可以重新打開它寫:如果你想只有字母,你可以用這個測試來代替

with open(file_name, 'r') as f: 
    for line in all_one_case: 
     f.write(line) 
1

如果在一個行,你可能只有一個符號,那麼我不知道爲什麼你將行(k)轉換爲元組,第二次調用f.readlines()可能是錯誤。第一次撥打f.readlines()後,您的所有行都在lines變量中,並且在循環中您可以逐行檢查它。

如果你想檢查是整個字符串是大寫或小寫,然後用這樣的代碼:

if line.islower() or line.isupper(): 
    print(line) 
1

我會使用列表理解:

f=open(file_name,'r') 

lines = f.readlines() 

ul_lines = [line.rstrip('\n') for line in lines if line.islower() or line.isupper()] 

如果你的文件,你應該調整它是unicode,但這是一般的想法。

rstrip部分是在最後擺脫'\ n'。

此外,更多的內存效率的版本

f=open(file_name,'r') 

ul_lines = [line.rstrip('\n') for line in f if line.islower() or line.isupper()] 

你必須重新打開文件,雖然重複了。

如果你是非常內存受限的,你應該用生成器表達式:

f=open(file_name,'r') 

ul_lines_gen = (line.rstrip('\n') for line in f if line.islower() or line.isupper()) 

如果你想只在你的字符串字母和數字沒有增加line.rstrip(「\ n」),因而isalpha()條件。

+0

+1我剛剛發佈了類似的解決方案。 :) – luc

1
f=open(file_name,'r') 
print [l for l in f.readlines() if l.islower() or l.isupper()] 
1

使用with聲明爲open該文件。通過這種方式,即使發生異常,該文件也會得到closed。 使用字符串方法islowerisupper檢查字符串是全部大寫還是小寫。例如像這樣:

with open(filename) as f: 
    output = [line for line in f if line.isupper() or line.islower()]