python的新手,我正在写一个脚本,它正在做一堆I / O的东西,一个函数假设计算一个文件中有多少个字符类型= [OHCN],而不是多少次出现。例如:如果一个文件有“OOOOOHHHHNNN”,它将是3.这就是我所拥有的,有更好更有效的方法吗?还有一个问题,我在这个脚本中进行了大量的文件编辑,最初我有一些函数可以打开需要修改的文件。处理一个函数中的所有内容(因此打开文件一次并执行我需要在文件中执行的操作)或者打开每个函数以及文件然后关闭它们然后关闭其他函数会更高效吗?做那件事....再次感谢你的帮助
def ReadFile(xyzfile, inputFile):
key_atoms = "OHCN"
s = open(xyzfile).read()
atom_count = {ltr: 0 for ltr in key_atoms}
for char in text:
if char in key_atoms:
atom_count[char] += 1
for key in sorted(atom_count):
with open(inputFile) as f:
string1 = "ntyp = 2"
string2 = "ntyp = ", atom_count[key]
s = f.read()
s = s.replace(str(string1), str(string2))
答案 0 :(得分:1)
如果您追踪每个原子(或字符)的唯一类型,那么我们可以使用set
并找到它与我们可以访问的文件中的字符的交集,而无需读取整个文件进入内存(我们在这里使用itertools.chain
而不是嵌套循环)。同样通过对两个文件使用with
语句,我们得到一个全有或全无的方法(如果我们无法打开xyzfile和input_file - 那么我们不应该费心去继续)。您当前的代码看起来可以简化为:
from itertools import chain
with open(xyzfile) as f1, open(input_file) as f2:
atom_count = len(set('OHCN').intersection(chain.from_iterable(f1)))
s = f2.read().replace('ntyp = 2', 'nytp = {}'.format(atom_count))
您的替换可能更有效,但未指定s
正在使用的内容。
答案 1 :(得分:0)
counts = {}
with open(infilepath) as infile:
for line in infile:
for char in line:
if char not in counts:
counts[char] = 0
counts[char] += 1
print("There are", len(counts), "different characters in the file")
for key in counts:
print("There are", counts[key], "occurrences of", key, "in the file")