2016-12-04 3 views
-3

Мой код выполняет поиск определенных файлов и вызывает отдельный .py-файл для вывода некоторых данных. Я вручную добавил строку для размера файла для каждого файла. Я просто хочу добавить к концу итераций сумму всех размеров файлов найденных файлов. Я предполагаю, что это будет связано с использованием логического индексирования, однако я не нашел никакой хорошей ссылки. Я хочу найти все столбцы, помеченные как «размеры файлов», а затем суммировать все их значения.суммировать значения в соответствии со строковым условием списка, сгенерированного циклом for


один пример итерации (я случайно положил много «размер файла» рядом друг с другом, но и в реальных данных, она будет отделена от около 15 линий)

xd = """Version 3.1.5.0 
GetFileName C:\\users\\trinh\\downloads\\higgi022_20150612_007_bsadig_100fm_aft_newIonTrap3.raw 
GetCreatorID thermo 
GetVersionNumber 64 
file size 1010058 
file size 200038 
file size 48576986 
file size 387905 
misc tester 
more python""" 

на конец для цикла я хочу суммировать все размеры файлов (это очень неправильно, но это моя лучшая попытка):

zd = xd.split() 
for aline in zd: 
    if 'file size' in aline: 
     sum = 0 
     for eachitem in aline[1:]: 
      sum += eaechitem 
      print(sum) 
+0

Попробуйте подумать, какова ваша конкретная проблема и свести к минимуму сообщение, поэтому он содержит только соответствующий код и информацию –

+0

'sum (k)' ?? ничего не делает. –

+0

привет Ni, я вырезал код, который не имел отношения к вопросу и добавил некоторые комментарии. Может быть, более ясно, что я пытаюсь сделать? –

ответ

0

для примера данные, которые вы дали, чтобы получить общее количество всех строк, которые начинаются с file size вы можете сделать следующее:

xd = """Version 3.1.5.0 
GetFileName C:\\users\\trinh\\downloads\\higgi022_20150612_007_bsadig_100fm_aft_newIonTrap3.raw 
GetCreatorID thermo 
GetVersionNumber 64 
file size 1010058 
file size 200038 
file size 48576986 
file size 387905 
misc tester 
more python""" 

total = 0 

for line in xd.splitlines(): 
    if line.startswith('file size'): 
     total += int(line.split()[2]) 

print(total) 

Это выведет:

50174987 

Этот первый шпагат xd в линии, и каждая линия определяет если он начинается со слов file size. Если он делает это, то использует split(), чтобы разбить линию на 3 части. Третья часть содержит размер как строку, поэтому ее необходимо преобразовать в целое число, используя int().


Чтобы расширить эту работу на файл, сначала нужно будет прочитать файл и всего необходимые строки, а затем открыть его в режиме добавления, чтобы написать общее:

with open('data.txt') as f_input: 
    total = 0 

    for line in f_input: 
     if line.startswith('file size'): 
      total += int(line.split()[2]) 

with open('data.txt', 'a') as f_output: 
    f_output.write("\nTotal file size: {}\n".format(total)) 

на основе текущего сценария, вы можете включить его следующим образом:

import os 
import csv 
from subprocess import run, PIPE 

pathfile = 'C:\\users\\trinh\\downloads' 
msfilepath = 'C:\\users\\trinh\\downloads\\msfilereader.py' 

file_size_total = 0 

with open("output.csv", "w", newline='') as csvout: 
    writer = csv.writer(csvout, delimiter=',') 

    for root, dirs, files in os.walk(pathfile): 
     for f in files: 
      if f.endswith(".raw"): 
       fp = os.path.join(root, f) #join the directory root and the file name 
       p = run(['python', msfilepath, fp], stdout=PIPE) #run the MSfilereader.py path and each iterated raw file found 
       p = p.stdout.decode('utf-8') 

       for aline in p.split('\r\n'): 
        header = aline.split(' ', 1) 
        writer.writerows([header]) 

        if 'END SECTION' in aline and aline.endswith('###'): 
         file_size = os.stat(fp).st_size 
         file_size_total += file_size 
         lst_filsz = ['file size', str(file_size)] 
         writer.writerow(lst_filsz) 

    writer.writerow(["Total file size:", file_size_total]) 

Это даст вам в общей сложности ALL file size записей. Также было бы возможно добавить подтаблицы для каждого раздела, если это было необходимо.

Обратите внимание, при использовании with open(...., не нужно также добавить close() для файла, как только вы выходите из сферы действия with заявления, файл автоматически закрываются.

+0

Привет, Мартин, спасибо за ваш ответ, я ценю вашу помощь. Я уверен, что ваш код будет работать, но я не могу реализовать его в моем существующем коде. Я создаю данные для каждого файла, найденного из отдельного .py-файла, используя for loop-пикеты, и в конце этого цикла я вручную добавляю размер файла, используя оператор if, который ищет последнюю строку каждой итерации. Я думаю, это не очень хорошая техника, но я сделал это, чтобы делать то, что хотел.Тем не менее, я не знаю, как перебирать строку «размер файла», потому что (я думаю) она не существует априори. Нет ничего, чтобы перебирать размеры файлов –

+0

Если вы используете 'csv', просто добавьте что-то вроде:' csv_output.writerow (['total size', total]) 'перед закрытием файла (вне вашего цикла) –

+0

Возможно, вы могли бы скопировать свой скрипт на сайт, такой как [0bin.net] (https://0bin.net/) и разместить ссылку на него здесь. –

Смежные вопросы