我的目录中包含以下格式的文件:
name,sex,count
xyz,M,231
abc,F,654
...
我正在尝试获取所有文件的计数总和(第3列)并将它们存储在列表中。
total = []
result = 0
for filename in os.listdir(direc):
if filename.endswith('.txt'):
file = open(direc + '/' + filename, 'r')
for line in file:
line = line.strip()
name, sex, count = line.split(',')
if sex == 'F':
result += int(count)
total.append(result)
有关为什么我的代码无效的任何提示?
试图获得:
[sum(file1), sum(file2)...]
编辑:
INPUT:
file1:
xyz,M,231
abc,F,654
file2:
wee,M,231
pol,F,654
bgt,M,434
der,F,543
file3:
wer,F,432
uio,M,124
poy,F,783
答案 0 :(得分:0)
首先,您应该始终确保关闭文件描述符(它与问题无关,但它是代码样式)。
此外,您应该使用os.path.join
来连接路径,因为它更便于携带(相同的注释)。
这是它给出的:
total = []
result = 0
for filename in os.listdir(direc):
if filename.endswith('.txt'):
with open(os.path.join(direc, filenameà, 'r') as file:
for line in file:
line = line.strip()
name, sex, count = line.split(',')
if sex == 'F':
result += int(count)
total.append(result)
现在,回到问题:你没有选择第三行,但是第二列是F的所有行......
以下是如何获得第三行:
total = []
result = 0
for filename in os.listdir(direc):
if filename.endswith('.txt'):
with open(direc + '/' + filename, 'r') as file:
file.readline() # Read first line
file.readline() # Read second line
line file.readline() # Read third line
line = line.strip()
name, sex, count = line.split(',')
result += int(count)
total.append(result)
答案 1 :(得分:0)
您应该跳过文本文件的标题行,这样您就不会尝试将“count”解析为int。
另外,我猜你只想在循环后附加结果?
total = []
result = 0
for filename in os.listdir(direc):
if filename.endswith('.txt'):
with open(direc + '/' + filename, 'r') as file:
next(file)
for line in file:
line = line.strip()
name, sex, count = line.split(',')
if sex == 'F':
result += int(count)
total.append(result)
答案 2 :(得分:0)
这里的代码使用绝对最少的修改(即没有修改样式):
total = []
for filename in os.listdir(direc):
result = 0
if filename.endswith('.txt'):
file = open(direc + '/' + filename, 'r')
for line in file:
line = line.strip()
try:
name, sex, count = line.split(',')
except ValueError:
continue
if sex == 'F':
result += int(count)
total.append(result)
必须修复以下内容:
result
变量仅设置为零一次,而不是每个文件一次,因此每个新文件读取都会添加到上一个文件的总数中。根据我的理解,您正在尝试将每个文件的结果添加到total
列表中,因此我移动此行以使该变量具有正确的结果。name, sex, count = line.split(',')
非常脆弱,只要行中有一行没有2个逗号(包括结束换行符),就会抛出错误。我把它包装成一个尝试...除了阻止这些错误的块然后在需要时移动到下一行。result
附加到每行读取的total
列表,而不是每个文件。如果我误解了您的意图并且您只想在total
变量中保留一个总计,以供参考,您只需要修改#2。
答案 3 :(得分:0)
我会建议一些改变:
import glob
from collections import defaultdict
result = defaultdict(int)
for fname in glob.glob('/path/to/dir/*.txt'):
with open(fname) as f:
for line in f:
try:
name, sex, count = line.split(',')
if sex == 'F':
result[fname] += int(count)
except ValueError: # unpack error, integer conversion error
print("ValueError with '{}', continuing".format(line))
print(result)
defaultdict
是一个方便的事情:它的行为类似于普通字典,但如果某个键不存在,则会使用默认值创建,在本例中为零。像这样你只需添加你的价值,如果总计尚未存在,则默认为0。
使用glob
可以避免使用listdir
和filename.endswith
结构,如果您愿意,可以查看。
然后,整数转换和元组解包可能是一件麻烦事,特别是当你有不同的输入时。为防止脚本中断,我建议使用try...except
阻止。