我对Python比较陌生,我真的可以使用你们中的一些人。
我运行的脚本以下列格式存储文件:
201309030700__81.28.236.2.txt
201308240115__80.247.17.26.txt
201308102356__84.246.88.20.txt
201309030700__92.243.23.21.txt
201308030150__203.143.64.11.txt
每个文件都有一些代码行,我想要计算它的总和,然后我想存储它。例如,我想浏览这些文件,如果文件具有相同的日期(文件名的第一部分),那么我想以下列格式将其存储在同一文件中。
201309030700__81.28.236.2.txt has 10 lines
201309030700__92.243.23.21.txt has 8 lines
创建一个日期为20130903的文件(最后4位是我不想要的时间)。创建文件: 20130903.txt 其中有两行代码 10 8
我有以下代码,但我没有得到任何地方,请帮助。
import os, os.path
asline = []
ipasline = []
def main():
p = './results_1/'
np = './new/'
fd = os.listdir(p)
run(fd)
def writeFile(fd, flines):
fo = np+fd+'.txt'
with open(fo, 'a') as f:
r = '%s\t %s\n' % (fd, flines)
f.write(r)
def run(path):
for root, dirs, files in os.walk(path):
for cfile in files:
stripFN = os.path.splitext(cfile)[0]
fileDate = stripFN.split('_')[0]
fileIP = stripFN.split('_')[-1]
if cfile.startswith(fileDate):
hp = 0
for currentFile in files.readlines()[1:]:
hp += 1
writeFile(fdate, hp)
我试着玩这个剧本:
if not os.path.exists(os.path.join(p, y)):
os.mkdir(os.path.join(p, y))
np = '%s%s' % (datetime.now().strftime(FORMAT), path)
if os.path.exists(os.path.join(p, m)):
os.chdir(os.path.join(p, month, d))
np = '%s%s' % (datetime.now().strftime(FORMAT), path)
FORMAT具有以下值
20130903
但我似乎无法让它发挥作用。
编辑: 我修改了代码如下,它有点做我想做的事情,但可能我做的事情多余,我仍然没有考虑到我正在处理大量的文件,所以也许这不是最多的有效的方式。请看看。
import re, os, os.path
p = './results_1/'
np = './new/'
fd = os.listdir(p)
star = "*"
def writeFile(fd, flines):
fo = './new/'+fd+'_v4.txt'
with open(fo, 'a') as f:
r = '%s\n' % (flines)
f.write(r)
for f in fd:
pathN = os.path.join(p, f)
files = open(pathN, 'r')
fileN = os.path.basename(pathN)
stripFN = os.path.splitext(fileN)[0]
fileDate = stripFN.split('_')[0]
fdate = fileDate[0:8]
lnum = len(files.readlines())
writeFile(fdate, lnum)
files.close()
目前,它正在写入一个文件,其中包含每行计数的新行数。但是我已对此进行了排序。我非常感谢你的一些意见,非常感谢你。
编辑2: 现在我得到每个文件的输出,日期为文件名。文件现在显示为:
20130813.txt
20130819.txt
20130825.txt
现在每个文件都是:
15
17
18
21
14
18
14
13
17
11
11
18
15
15
12
17
9
10
12
17
14
17
13
每个文件还会继续200多行。理想情况下,到目前为止,每次事件发生多次,并且以最小的数字排序,这将是最佳的预期结果。
我尝试过类似的事情:
import sys
from collections import Counter
p = '.txt'
d = []
with open(p, 'r') as f:
for x in f:
x = int(x)
d.append(x)
d.sort()
o = Counter(d)
print o
这有意义吗?
编辑3:
我有以下脚本为我计算唯一,但我仍然无法按唯一计数排序。
import os
from collections import Counter
p = './newR'
fd = os.listdir(p)
for f in fd:
pathN = os.path.join(p, f)
with open(pathN, 'r') as infile:
fileN = os.path.basename(pathN)
stripFN = os.path.splitext(fileN)[0]
fileDate = stripFN.split('_')[0]
counts = Counter(l.strip() for l in infile)
for line, count in counts.most_common():
print line, count
这有以下结果:
14 291
15 254
12 232
13 226
17 212
16 145
18 127
11 102
10 87
19 64
21 33
20 24
22 15
9 15
23 9
30 6
60 3
55 3
25 3
输出应如下所示:
9 15
10 87
11 102
12 232
13 226
14 291
etc
最有效的方法是什么?
答案 0 :(得分:0)
Dictionaries非常适合这样的任务。如果要以递归方式处理不同目录深度的输入文件,则必须修改下面的示例。另外请记住,您可以将Python字符串视为列表,这样您就可以splice它们(这可以减少凌乱的正则表达式)。
D = {}
fnames = os.listdir("txt/")
for fname in fnames:
print(fname)
date = fname[0:8] # this extracts the first 8 characters, aka: date
if date not in D:
D[date] = []
file = open("txt/" + fname, 'r')
numlines = len(file.readlines())
file.close()
D[date].append(fname + " has " + str(numlines) + " lines")
for k in D:
datelist = D[k]
f = open('output/' + k + '.txt', 'w')
for m in datelist:
f.write(m + '\n')
f.close()
答案 1 :(得分:0)
以下代码完成了我的初步问题。
import os, os.path, subprocess
from sys import stdout
p = './new/results/v4/TRACE_v4_results_ASN_mh60'
fd = os.listdir(p)
def writeFile(fd, flines):
fo = './new/newR/'+fd+'_v4.txt'
with open(fo, 'a') as f:
r = '%s\n' % (flines)
f.write(r)
for pfiles in dirs:
pathN = os.path.join(path, pfiles)
files = open(pathN, 'r')
fileN = os.path.basename(pathN)
stripFN = os.path.splitext(fileN)[0]
fileDate = stripFN.split('_')[0]
fdate = fileDate[0:8]
numlines = len(files.readlines()[1:])
writeFile(fdate, numlines)
files.close()
它产生了以下结果:
20130813.txt
20130819.txt
20130825.txt
如果我没有遵守规则,我会真诚地道歉。