2014-02-24 49 views
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。所有結果同樣悲慘。

+1

同樣悲劇? :)意義在文件中沒有改變?有其他事情發生了嗎?請指定。 – batbrat

+0

1.文件以錯誤模式打開,2.一旦讀取文件文件指針移動,因此您不覆蓋邏輯錯誤3.創建一個新文件寫入並刪除這個舊文件並重命名該文件。 –

+0

'IRS'或'camelCase''Hyphenated-Words'是什麼意思? –

回答

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 
1

您可以嘗試使用在similar question中詢問的.title()方法。另外,請確保您使用f.write()將更改寫回文件。只是將模式設爲r +不會爲您保留任何文件。

f = open('somescript.sql','r+'): 
text = f.read() 
text = text.title() 
f.write(text) 
f.close() 
0

這裏是我的問題的解決方案,它使用regex處理實際的替代品,但是這很容易通過編寫自己的解析器來完成。

以此爲我的測試INP

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 = "" 
0

可以在讀模式打開當前文件somescript.sql'。閱讀每一行並處理它,例如如果有列名稱,則首先大寫第一個後綴,並用_替換空格。這可以使用正則表達式完成。稍後,您可以刪除舊文件並將臨時文件重命名爲舊文件名。

腳本。潘岳:

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 

somescript文件是:

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標題後跟空間由_取代。
相關問題