Как сделать некоторые слова в текстовом файле заглавными?

У меня есть текстовый файл с нормальными предложениями. На самом деле, я спешил, печатая этот файл, поэтому я просто написал первую букву первого слова предложения с заглавной буквы (согласно английской грамматике).

Но теперь я хочу, чтобы было лучше, если первая буква каждого слова была заглавной. Что-то типа:

Каждое слово в этом предложении пишется с большой буквы

В приведенном выше предложении следует отметить, что of и is не пишутся с заглавной буквы, на самом деле я хочу избежать слов, которые равны или меньше 3 письма.

Что я должен делать?


person Santosh Kumar    schedule 26.07.2012    source источник
comment
Я хочу избежать слов, которые равны или меньше 3 букв. - есть слова, содержащие более 3 символов, которые не должны быть написаны с заглавной буквы.   -  person dj18    schedule 26.07.2012


Ответы (5)


Вы должны разделить слова и использовать заглавные только те, которые длиннее трех букв.

words.txt:

each word of this sentence is capitalized
some more words
an other line

-

import string


with open('words.txt') as file:
    # List to store the capitalised lines.
    lines = []
    for line in file:
        # Split words by spaces.
        words = line.split(' ')
        for i, word in enumerate(words):
            if len(word.strip(string.punctuation + string.whitespace)) > 3:
                # Capitalise and replace words longer than 3 (without punctuation).
                words[i] = word.capitalize()
        # Join the capitalised words with spaces.
        lines.append(' '.join(words))
    # Join the capitalised lines.
    capitalised = ''.join(lines)

# Optionally, write the capitalised words back to the file.
with open('words.txt', 'w') as file:
    file.write(capitalised)
person Artur Gaspar    schedule 26.07.2012
comment
Близко, но как насчет пунктуации, увеличивающей количество букв в слове? - person martineau; 26.07.2012
comment
Почти идеально, за исключением встроенных знаков препинания (т.е. не может). +1 в любом случае. - person martineau; 26.07.2012
comment
@ArturGaspar Как мне предотвратить запись/печать пустой строки этой скриптовой формы в конце. - person Santosh Kumar; 21.08.2012
comment
@Santosh Удалите пустую строку из входного файла. - person Artur Gaspar; 22.08.2012
comment
@ArturGaspar В моем входном файле нет пустой строки, только одна строка слов с маленьким регистром. - person Santosh Kumar; 22.08.2012
comment
@Santosh И вывод все еще содержит лишнюю пустую строку? Странно, я проверил его, прежде чем ответить на ваш комментарий, и он работал нормально. Можете ли вы проверить его запись в файл вместо его печати? - person Artur Gaspar; 22.08.2012
comment
В ПОРЯДКЕ! Я прошу прощения. Я немного изменил этот скрипт. Вот оно. Вы можете отладить его? - person Santosh Kumar; 22.08.2012
comment
Извините, моя вина. Вместо os.linesep.join(lines) вы должны использовать ''.join(lines). - person Artur Gaspar; 22.08.2012
comment
Это тоже не работает. Вы видели мой модифицированный сценарий?? Я передаю аргумент скрипту. Кстати, ваш скрипт и раньше работал хорошо. Но, наконец, после того, как я изменил его, он пишет пустую строку. Вот почему я просил отладку. - person Santosh Kumar; 22.08.2012
comment
@Santosh Это работает. Пустая строка в конце вставляется функцией print. - person Artur Gaspar; 22.08.2012
comment
@ArturGaspar Действительно сработало? Я все еще получаю черную полосу, наконец. - person Santosh Kumar; 22.08.2012
comment
@Santosh Попробуйте записать его в файл, а не печатать, затем откройте выходной файл в текстовом редакторе и посмотрите, правильно ли он. - person Artur Gaspar; 22.08.2012
comment
@ArturGaspar Что ты имеешь в виду, когда пишешь? Делаете python script.py input.txt > output.txt? Таким образом, я все еще получаю пустую строку. - person Santosh Kumar; 22.08.2012
comment
@Сантош f = open('outfile.txt', 'w'); f.write(capitalised); f.close(). - person Artur Gaspar; 22.08.2012
comment
@ArturGaspar Еще одна модификация. Я хочу, чтобы, если указан третий аргумент, он принимал его как имя выходного файла, если нет, то он возвращается к умолчанию output.txt - person Santosh Kumar; 22.08.2012
comment
@Santosh Прочитайте документацию модуля argparse. Если вы уже решили проблему с пустой строкой, задайте еще один вопрос. - person Artur Gaspar; 22.08.2012
comment
@ArturGaspar По правде говоря, я не связываю способ сохранения этого скрипта в файл, мне было хорошо делать python script.py input.txt > output.txt. Можете ли вы добавить еще несколько строк скрипта, чтобы удалить последнюю строку? Является ли это возможным? - person Santosh Kumar; 22.08.2012
comment
@Santosh Что вызывает дополнительную строку в конце, так это функция print. sys.stdout.write(capitalised) не должен печатать лишнюю пустую строку. - person Artur Gaspar; 22.08.2012
comment
@ArturGaspar Вы ошибались, я заменил words = line.split(' ') на words = line.split() и получил то, что хотел. - person Santosh Kumar; 22.08.2012
comment
@SantoshKumar words = line.split() не будет сохранять интервалы. - person Artur Gaspar; 04.11.2012
comment
@ArturGaspar Ты был прав. words = line.split() не сохраняет интервал. Проблема в том, что words = line.split(' ') создает пустую новую строку после записи каждой строки. И sys.stdout.write() только удаляет новую строку из последней строки. Я не могу использовать ни один из них. - person Santosh Kumar; 23.01.2013

for line in text_file:
    print ' '.join(word.title() if len(word) > 3 else word for word in line.split())

Изменить: чтобы не считать знаки препинания, замените len следующей функцией:

def letterlen(s):
    return sum(c.isalpha() for c in s)
person Steven Rumbalski    schedule 26.07.2012
comment
Не учитывает пунктуацию при вычислении длины слова. - person martineau; 26.07.2012
comment
@мартино. Отредактировано для решения вашей проблемы. - person Steven Rumbalski; 26.07.2012
comment
word.title() не может писаться с большой буквы как Can'T. Вместо этого можно использовать word.capitalize(), в котором заглавной будет только первая буква word. - person Artur Gaspar; 22.08.2012

Взгляните на NLTK.

Маркируйте каждое слово и используйте его с большой буквы. Такие слова, как «если», «из» называются «стоп-словами». Если вашим критерием является исключительно длина, ответ Стивена - хороший способ сделать это. Если вы хотите найти стоп-слова, в SO есть аналогичный вопрос: Как удалить стоп-слова с помощью nltk или python.

person clwen    schedule 26.07.2012

Что вам действительно нужно, так это то, что называется списком стоп-слов. При отсутствии этого списка вы можете составить его самостоятельно и сделать так:

skipWords = set("of is".split())
punctuation = '.,<>{}][()\'"/\\?!@#$%^&*' # and any other punctuation that you want to strip out
answer = ""

with open('filepath') as f:
    for line in f:
        for word in line.split():
            for p in punctuation:
                # you end up losing the punctuation in the outpt. But this is easy to fix if you really care about it
                word = word.replace(p, '')  
            if word not in skipwords:
                answer += word.title() + " "
            else:
                answer += word + " "
    return answer # or you can write it to file continuously
person inspectorG4dget    schedule 26.07.2012
comment
Хороший подход, но необходимо учитывать пунктуацию (которая обычно не считается буквой в слове). - person martineau; 26.07.2012
comment
В вашем обновлении решается проблема с пунктуацией, но сделано это, как я подозреваю, менее чем оптимальным способом грубой силы. - person martineau; 26.07.2012
comment
@martineau Как бы вы это оптимизировали? - person inspectorG4dget; 26.07.2012
comment
Ну, во-первых, вы можете создать набор знаков препинания и использовать его, чтобы избежать цикла for, который не нужен большинству слов. Во-вторых, удаление знака препинания, вероятно, может быть выполнено с помощью регулярного выражения re.sub() или даже str.translate(), если только символы не являются юникодными. - person martineau; 26.07.2012
comment
re.sub немного перебор и может стать слишком сложным при неправильном использовании (Дурак бросается туда, куда ангелы боятся ступить). Но мне нравится идея str.translate - person inspectorG4dget; 26.07.2012
comment
@inspectorG4dget Привет! Я не хотел экранировать только of и is, это был просто пример. Я хочу избежать любого слова, состоящего из 3 или менее букв. - person Santosh Kumar; 21.08.2012
comment
@Santosh: посмотрите на ответ @Steven Rumbalski. Он использует if len(word) > 3 для решения этой - person inspectorG4dget; 21.08.2012
comment
Использование word.capitalize() вместо word.title() позволяет избежать необходимости удалять знаки препинания. - person Artur Gaspar; 22.08.2012

Вы можете добавить все элементы из текстового файла в список:

list = []
f.open('textdocument'.txt)
for elm in f (or text document, I\'m too tired):
   list.append(elm)

И когда у вас есть все элементы в списке, запустите цикл for, который проверяет длину каждого элемента, и если он больше трех, возвращает первый элемент в верхнем регистре.

new_list = []
for items in list:
   if len(item) > 3:
      item.title()    (might wanna check if this works in this case)
      new_list.append(item)
   else:
   new_list.append(item)    #doesn't change words smaller than three words, just adds them to the new list

И посмотреть, работает ли это?

person Aaron Tp    schedule 26.07.2012
comment
stackoverflow.com/questions/1549641/ Если мой метод капитализации не сработал, попробуйте методы, упомянутые здесь.... - person Aaron Tp; 26.07.2012
comment
for elm in f поместит в список каждую строку текстового файла, а не каждое слово. Ваш отступ в последней строке немного перепутался. - person martineau; 26.07.2012
comment
Да, я не копировал/вставлял код, я написал его в форме, что обычно не очень хорошо получается. - person Aaron Tp; 26.07.2012