【问题标题】:Capitalize first letter of each word between [ and ] in text file将文本文件中 [ 和 ] 之间的每个单词的首字母大写
【发布时间】:2014-03-26 12:16:55
【问题描述】:

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

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

当文件在 '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.文件以错误的模式打开,2. 一旦你读取一个文件,文件指针被移动,所以你没有覆盖逻辑是错误的 3. 创建一个新文件写入并删除这个旧文件并重命名该文件。
  • IRScamelCase Hyphenated-Words 之类的呢?
  • 这些方括号是否真的存在于您的文件中?或者你只是用它们来表示占位符文本?你能提供与它们看起来完全一样的示例输入/输出吗?
  • @batbrat 为颜色道歉。同样悲惨的意味着两者都是失败的。一个以一个空文件结束,另一个比我开始时多了几百万行。

标签: python capitalize


【解决方案1】:

我的编码方式:

  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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您可以在阅读模式下打开当前文件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,标题后跟空格替换为_

      【讨论】:

        【解决方案4】:

        这是我对您问题的解决方案,它使用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 = ""
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-10
          • 2015-04-19
          • 1970-01-01
          • 2020-08-30
          • 2015-11-04
          • 2012-11-11
          • 2012-07-24
          • 1970-01-01
          相关资源
          最近更新 更多