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

1

You can try using the .title() method asked here in a similar question. Also, make sure that you write the changes back to the file with f.write(). Just having the mode as r+ doesn't persist anything to the file for you.

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

現在のファイル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

私は次のようにしました.2つのファイルがあります:

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列名である最初の引数を 2 番目の引数に置き換えます。2 番目の引数c.title().replace(' ', '_')にはcタイトルが付けられ、その後にスペースが に置き換えられ_ます。
于 2014-02-24T18:09:49.827 に答える
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 = ""
于 2014-02-24T17:56:02.097 に答える