0

すべて大文字またはすべて小文字のファイルのすべての行を読み取ろうとしています。

含まれている場合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か?

もっと簡単にできる方法があれば、それは素晴らしいことです

4

6 に答える 6

5

j は整数ではなく文字列であるため、エラーが発生しています (str(j)ちなみに、 を呼び出す必要はありません。既に文字列になっています)。

次のように、大文字と小文字が混在する行を削除できます。

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

isupper()注: andの使用に対するクレジット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)
于 2011-12-09T08:48:54.677 に答える
2
def homogeneous_lines (file_name):
    with open(file_name) as fd:
        for line in fd:
            if line.islower() or line.isupper():
                yield line

この関数は、ファイル内のすべての行を読み取ります。次に、行ごとに、行がすべて大文字か小文字かを確認します。

最後に、行を譲ります。

編集 - with ステートメントの使用を組み込むように変更し、組み込みの islower() と isupper() を文字列に使用し、ジェネレーターにしました。

于 2011-12-09T08:45:44.663 に答える
1

1 行にシンボルを 1 つしか持てない場合、なぜ行 ( ) をタプルに変換するのかわかりませんk。2 回目の呼び出しf.readlines()はおそらくバグです。最初の呼び出しの後、f.readlines()すべての行がlines変数になり、ループで行ごとに確認できます。

文字列全体が小文字か大文字かを確認したい場合は、次のようなコードを使用します。

if line.islower() or line.isupper():
    print(line)
于 2011-12-09T08:51:43.587 に答える
1
f=open(file_name,'r')
print [l for l in f.readlines() if l.islower() or l.isupper()]
于 2011-12-09T08:57:59.333 に答える
1

withファイルのステートメントを使用openします。closeこのようにして、例外が発生した場合でもファイルが取得されるので安全です。文字列メソッドislowerとを使用して、文字isupper列がすべて大文字か小文字かを確認します。たとえば、次のようにします。

with open(filename) as f:
  output = [line for line in f if line.isupper() or line.islower()]
于 2011-12-09T08:58:03.390 に答える
1

リスト内包表記を使用します。

f=open(file_name,'r')

lines = f.readlines()

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

ファイルがユニコードの場合は微調整する必要がありますが、それが一般的な考え方です。

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() 条件を追加します。

于 2011-12-09T08:55:53.253 に答える