Прочитать все строки в .txt, которые все прописные или строчные Python 2.7.1? - PullRequest
0 голосов
/ 09 декабря 2011

Я пытаюсь прочитать все строки файла, которые имеют верхний или нижний регистр.

Если 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 -статум?

Если есть более простой способ сделать это, было бы замечательно

Ответы [ 6 ]

5 голосов
/ 09 декабря 2011

Вы получаете ошибку, потому что 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)
2 голосов
/ 09 декабря 2011
def homogeneous_lines (file_name):
    with open(file_name) as fd:
        for line in fd:
            if line.islower() or line.isupper():
                yield line

Эта функция считывает каждую строку в файле.Затем для каждой строки проверяется, все ли строки в верхнем или нижнем регистре.

Наконец, мы получаем строку.

EDIT - изменено, чтобы включить использование с оператором, использовать встроенные islower () и isupper () для строк и преобразовано в генератор.

1 голос
/ 09 декабря 2011

используйте оператор with для open файла. Таким образом, вы можете быть уверены, что файл получит close d даже в случае исключения. Используйте строковые методы islower и isupper, чтобы проверить, является ли строка прописными или строчными. Например, как это:

with open(filename) as f:
  output = [line for line in f if line.isupper() or line.islower()]
1 голос
/ 09 декабря 2011
f=open(file_name,'r')
print [l for l in f.readlines() if l.islower() or l.isupper()]
1 голос
/ 09 декабря 2011

Я бы использовал списочные выражения:

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 ().

1 голос
/ 09 декабря 2011

Если в одной строке вы можете иметь только один символ, тогда я не знаю, почему вы конвертируете строку (k) в кортеж, а второй вызов f.readlines(), вероятно, является ошибкой.После первого вызова f.readlines() у вас есть все строки в переменной lines, и в цикле вы можете проверять ее построчно.

Если вы хотите проверить, вся ли строка строчная или прописная, используйте такой код:

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