我正在尝试编写一个python脚本来格式化SQL代码以提高可读性。
例如。将特定的小写单词转换为大写: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中编写它?
答案 0 :(得分: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))
正则表达式能够在一次调用中执行所有替换。
答案 1 :(得分:0)
您在同一个实例中打开读写操作。尝试关闭读取功能并在完成后打开新的写入功能,它可以解决问题。
答案 2 :(得分:0)
您可以迭代文件一次,然后将生成的列表写入输出文件:
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))
答案 3 :(得分:0)
第三方库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);