【问题标题】:Python: Capitalise specific words in a text filePython:将文本文件中的特定单词大写
【发布时间】:2017-11-22 14:53:43
【问题描述】:

我正在尝试编写一个 python 脚本来格式化 SQL 代码以获得更好的可读性。

例如。将特定的小写单词转换为大写:select -> SELECT

我正在尝试使用 Python 中的读写功能来做到这一点。但是,我被困住了。这是我的代码:

words = ['select', 'from', 'where']
w = open('03_TextUpper.txt', 'w')

with open('03_TextLower.txt', 'r') as file:

    for line in file:
        for word in line.split():
            if word in words:
                w.write( word.upper() )

    w.write( line ) 

这会打印出特定单词的大写字母,但不会删除小写单词。

有没有更好的方法用 Python 编写这个?

【问题讨论】:

    标签: python python-3.x text


    【解决方案1】:

    我建议你这样做是两个阶段:

    words = ['select', 'from', 'where']
    
    with open('03_TextUpper.txt') as f_input:
        text = f_input.read()
    
    with open('03_TextUpper.txt', 'w') as f_output:
        for word in words:
            text = text.replace(word, word.upper())
    
        f_output.write(text)
    

    首先将整个文件读入内存并进行必要的更改。接下来打开要写入的文件并将其写回。

    它使用 Python 字符串 replace() 将每个单词替换为大写字母。它一次性对整个文件执行此操作,而无需拆分文件。


    这可以通过使用正则表达式来发现单词边界来改善:

    import re
    
    words = ['select', 'from', 'where']
    uppercase = lambda x: x.group(1).upper()
    re_replace = re.compile(r'\b({})\b'.format('|'.join(words)))
    
    with open('03_TextUpper.txt') as f_input:
        text = f_input.read()
    
    with open('03_TextUpper.txt', 'w') as f_output:
        f_output.write(re_replace.sub(uppercase, text))
    

    正则表达式能够在一次调用中执行所有替换。

    【讨论】:

    • 这太棒了!但是,此代码将替换单词列表中的任何字符组合。例如,如果 words = ['select', 'from', 'where', 'in'] 则带有 'in' 的单词(如获取)将变为 obtaIN。
    • 通常会使用正则表达式来阻止它。我已将其更新为使用一个。
    【解决方案2】:

    您正在同一个实例中打开读取和写入。尝试关闭您的读取功能并在完成后打开一个新的写入功能,它可以解决问题。

    【讨论】:

      【解决方案3】:

      可以对文件进行一次迭代,然后将生成的列表写入输出文件:

      words = ['select', 'from', 'where']
      data = [i.strip('\n').split() for i in open('03_TextLower.txt')]
      new_words = [[b for b in i if b.lower() in words] for i in data]
      
      with open('03_TextUpper.txt', 'w') as f:
         for line in new_words:
             for word in line:
                f.write("{}\n".format(word))
      

      【讨论】:

        【解决方案4】:

        第三方库sqlparse 会这样做:

        >>> sql = 'select * from foo where id in (select id from bar);'
        >>> print sqlparse.format(sql, reindent=True, keyword_case='upper')
        SELECT *
        FROM foo
        WHERE id IN
          (SELECT id
           FROM bar);
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-02-28
          • 2012-07-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-31
          • 1970-01-01
          相关资源
          最近更新 更多