Python3 - 从所有文件中获取特定行的总和

时间:2015-04-09 20:14:35

标签: python file

我的目录中包含以下格式的文件:

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

4 个答案:

答案 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)

必须修复以下内容:

  1. result变量仅设置为零一次,而不是每个文件一次,因此每个新文件读取都会添加到上一个文件的总数中。根据我的理解,您正在尝试将每个文件的结果添加到total列表中,因此我移动此行以使该变量具有正确的结果。
  2. name, sex, count = line.split(',')非常脆弱,只要行中有一行没有2个逗号(包括结束换行符),就会抛出错误。我把它包装成一个尝试...除了阻止这些错误的块然后在需要时移动到下一行。
  3. result附加到每行读取的total列表,而不是每个文件。
  4. 如果我误解了您的意图并且您只想在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可以避免使用listdirfilename.endswith结构,如果您愿意,可以查看。

然后,整数转换和元组解包可能是一件麻烦事,特别是当你有不同的输入时。为防止脚本中断,我建议使用try...except阻止。