Сделать заглавной первую букву каждого слова между [ и ] в текстовом файле

РЕДАКТИРОВАТЬ: этот вопрос отличается от других вопросов «использовать заглавную букву», потому что он требует использования заглавных букв только между «[» и «]». Поскольку заголовок был неполным, я его отредактировал.

У меня есть текстовый файл, в котором мне нужно переформатировать текст.

Я пытался зациклить строки и слова, когда файл был открыт в 'r+', но безуспешно.

Вот пример:

Create Table Data(
    [SOME ID] int,
    [LAST NAME] varchar(30),
    [FIRST NAME] varchar(30),
    [TLA THING] smallint,
    [TLA THING REMARK] varchar(255)
)

Я хотел бы, чтобы первая буква в каждом слове между [] была заглавной. И в качестве бонуса я бы хотел, чтобы пробелы между [ ] были заменены символами подчеркивания.

код, который я пробовал:

f = open('somescript.sql','r+')
for line in f:
    for word in line:
        word.capitalize()

Я также пробовал f.write(word.capitalize()) вместо word.capitalize. Все результаты были одинаково трагичны.


person Stephen Lloyd    schedule 24.02.2014    source источник
comment
Так же трагично? :) То есть в файле ничего не менялось? Что-то еще случилось? Уточните.   -  person batbrat    schedule 24.02.2014
comment
1. файл открыт в неправильном режиме, 2. когда вы читаете файл, указатель файла смещается, поэтому вы не перезаписываете логику, это неправильно 3. Создайте новый файл, напишите в нем и удалите этот старый файл и переименуйте этот файл.   -  person Grijesh Chauhan    schedule 24.02.2014
comment
как насчет чего-то вроде IRS или camelCase Hyphenated-Words?   -  person Joran Beasley    schedule 24.02.2014
comment
Эти квадратные скобки действительно присутствуют в вашем файле? Или вы просто используете их для обозначения текста-заполнителя? Можете ли вы предоставить образцы ввода/вывода именно так, как они должны выглядеть?   -  person Kevin    schedule 24.02.2014
comment
@batbrat извиняюсь за цвет. одинаково трагично означало, что оба были неудачными. Один закончился пустым файлом, а другой — на миллионы строк больше, чем я начал.   -  person Stephen Lloyd    schedule 24.02.2014
comment
@GrjeshChauhan спасибо за отзыв.   -  person Stephen Lloyd    schedule 24.02.2014
comment
@JoranBeasley Я уже заменил дефисы. В настоящее время нет составных слов. Есть некоторые аббревиатуры с заглавной буквы, но я не особенно беспокоюсь о сохранении их заглавных букв.   -  person Stephen Lloyd    schedule 24.02.2014
comment
@AlexThornton Я посмотрел там, но еще раз проверю.   -  person Stephen Lloyd    schedule 24.02.2014
comment
@Kevin Они действительно присутствуют в сценарии sql. SQL Server использует их для разрешения нестандартных имен полей. Фактические сценарии, которые я буду изменять, были сгенерированы другим программным обеспечением.   -  person Stephen Lloyd    schedule 24.02.2014
comment
@StephenLloyd, спасибо за разъяснения. Я рад, что вы решили проблему.   -  person batbrat    schedule 26.02.2014


Ответы (4)


Как бы я закодировал это:

  1. загрузить все содержимое вашего файла
  2. используйте модуль re (re.sub поможет) для преобразования деталей, которые необходимо
  3. перезаписать файл преобразованным текстом

Реализация :

txt = # load your file
pattern = re.compile(r"\[(.*)\]")
transform = lambda mo : mo.group(0).title().replace(" ", "_")
new_txt = pattern.sub(transform, txt)
# write new text
person Kiwi    schedule 24.02.2014

Вы можете попробовать использовать метод .title(), заданный здесь в похожий вопрос. Также убедитесь, что вы записываете изменения обратно в файл с f.write(). Просто наличие режима r+ ничего не сохраняет для вас в файле.

f = open('somescript.sql','r+'):
text = f.read()
text = text.title()
f.write(text)
f.close()
person Nathan    schedule 24.02.2014

Вы можете открыть текущий файл somescript.sql' в режиме чтения. Прочитайте каждую строку и обработайте ее, например. если есть имя столбца, сначала заглавные буквы, а затем замените пробел на _ Это можно сделать с помощью регулярного выражения. Позже вы можете удалить старый файл и переименовать временный файл как старое имя.

script.py:

import os, re
with open("somescript.sql") as i: # open sql file for reading 
  with open("temp", "w") as o: # tem file for writing 
    for l in i: # read line by line 
      c = re.match(r".*\[(?P<col_name>.*)\].*", l) # use re to find col_name
      if c: # if column name found  
        c = c.group('col_name') # change col name 
        o.write(l.replace('['+c+']', '['+c.title().replace(' ', '_'))+']')
      else:       #         ^^ col name titled and replace every space by _  
        o.write(l)
os.remove("somescript.sql") # delete old file 
os.rename("temp", "somescript.sql")  # rename file

Я сделал так, у меня есть два файла:

answer$ ls
script.py  somescript.sql

какой-то файл скрипта:

answer$ cat somescript.sql 
Create Table Data(
    [SOME ID] int,
    [LAST NAME] varchar(30),
    [FIRST NAME] varchar(30),
    [TLA THING] smallint,
    [TLA THING REMARK] varchar(255)
)

$ python script.py  # run script 
/answer$ cat somescript.sql 
Create Table Data(
    [Some_Id] int,
    [Last_Name] varchar(30),
    [First_Name] varchar(30),
    [Tla_Thing] smallint,
    [Tla_Thing_Remark] varchar(255)
)

Чтобы объяснить: o.write(l.replace(c, c.title().replace(' ', '_')))

  1. o.write(x) записать строку x в файл
  2. l.replace(c, c.title().replace(' ', '_')) замените первый аргумент c, который является именем столбца, вторым аргументом c.title().replace(' ', '_'), второй аргумент c, заголовок, за которым следует пробел, заменяется на _.
person Grijesh Chauhan    schedule 24.02.2014

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

Используя это как мой тестовый ввод

text = '''Create Table Data(
    [lower case id] int,
    [loser case last name] varchar(30),
    [lower case first name] varchar(30),
    [lower case tla thing] smallint,
    [lower case tla thing remark] varchar(255)
)
'''

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

def format_input(val):
    val = val.strip()
    val = val.split()
    new_val = ""
    for word in val:
        new_val += word[0].upper() + word[1:] + "_"
    return new_val[:-1] //Remove the trailing underscore


content = ""
with open('mySQLfile.sql','r') as f:
    for line in f:
        content += line

import re
content = re.sub(r'\[(.*?)\]',lambda m: '['+format_input(m.group(1))+']',content,re.M)

with open('mySQLfile.sql','w') as f:
    f.write(content)

И без использования regex:

new_content = ""
buf = ""
in_tag = False
for i in content:
    if in_tag:
        buf += i
    else:
        new_content += i
    if i == '[':
        in_tag = True
    elif i == ']':
        in_tag = False
        new_content += format_input(buf)
        buf = ""
person Farmer Joe    schedule 24.02.2014