3

编辑:这个问题与其他“首字母大写”问题不同,因为它只需要在“[”和“]”之间大写。由于标题不完整,我已经编辑了它。

我有一个文本文件,我需要在其中重新格式化文本。

当文件在“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. 所有的结果都同样悲惨。

4

4 回答 4

2

我编码的方式:

  1. 加载文件的全部内容
  2. 使用模块rere.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
于 2014-02-24T17:25:10.830 回答
1

您可以尝试使用在类似问题.title()中提出的方法。此外,请确保将更改写回文件中。仅将模式设置为 r+ 不会为您将任何内容保存到文件中。f.write()

f = open('somescript.sql','r+'):
text = f.read()
text = text.title()
f.write(text)
f.close()
于 2014-02-24T17:26:49.960 回答
0

这是我对您的问题的解决方案,它用于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 = ""
于 2014-02-24T17:56:02.097 回答
0

somescript.sql'您可以在读取模式下打开当前文件。读取每一行并对其进行处理,例如,如果有一个列名,则先大写,然后将空格替换为 _ 这可以使用正则表达式来完成。稍后您可以删除旧文件并将临时文件重命名为旧文件名。

脚本.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标题后跟空格替换为_
于 2014-02-24T18:09:49.827 回答