0

所以我以前总是使用 hack 之类的方法进行编码if type(my_list[0]) == str,但后来我了解了这种isinstance方法,我有了一个想法:

如果我可以运行我自己的搜索和替换函数来使我的代码更高效和 Python 怎么办?

所以我有一个脚本的想法,我会向你描述它:

def fix_script(find,replace,*args):
    #code goes here

这将做什么,是在argsfor中搜索文件find,并将其替换为replace...这是棘手的部分...我希望能够以某种代数替换的方式来做到这一点。这是一个例子:

find = 'type({x}) == {y}:'
replace == 'isinstance({x},{y}):'
import os
directory = "Users/name/..."
files = os.listdir(directory)
fix_script(find,replace,files[0],files[1],files[2])

所以让我们说files[0]看起来像这样:

import pandas as pd
df = pd.read_csv('my_file.csv')
tester = df.number[0]
if type(tester) == str:
    #do something
elif type(tester) == int:
    #do something
elif type(tester) == float:
    #do something
else:
    print "invalid type"

函数运行后,该文件将被覆盖,如下所示:

import pandas as pd
df = pd.read_csv('my_file.csv')
tester = df.number[0]
if isinstance(tester,str):
    #do something
elif isinstance(tester,int):
    #do something
elif isinstance(tester,float):
    #do something
else:
    print "invalid type"

因此,有两个部分可以使这成为可能:

  1. 能够编写一个能够进行代数搜索的函数
  2. 让该函数能够采用 python 脚本,并覆盖其中的一部分

如果这是可能的,有什么想法,如果可以,我该如何实现?

注意:我需要一个可以通过不同的查找和替换来执行此操作的函数。

4

1 回答 1

2

我认为这里最好的解决方案是使用正则表达式。这个函数的作用很简单:你给它添加一个路径,它会扫描那个路径来查找 python 文件。如果找到,则以读写模式打开它,并替换patternto的所有文本repl,然后将更改写回文件。

脚本:

import os
import re

def fix_pys(path, pattern, repl):
    for root, dirs, files in os.walk(path):
        for f in files:
            name, ext = os.path.splitext(f)
            if ext == '.py':
                with open(os.path.join(root, f), 'r+') as py:
                    new_py = re.sub(pattern, repl, py.read())
                    py.seek(0)
                    py.write(new_py)
                    py.truncate()

用法:

fix_pys(
    '/Users/me/my_folder',
    r'type\((\w+)\)\s*==\s*(\w+)',
    # r'' -> raw string
    # \( and \) is a necessary escape, because braces means groups in regexes
    # \w+ means more than word character (word characters are: a-z A-Z 0-9 and _)
    # \s* means 0 or more spaces
    r'isinstance(\1, \2)'
    # \1 refers to the content of the first group
    # \2 refers to the content of the second group
)
于 2013-06-17T18:48:38.573 回答