Привет, я работаю с небольшим сценарием. Я пытаюсь распечатать все файлы в текущем каталоге и сохранить пары filename:filesize как key:value в size_dir.

from os import listdir,environ
from sys import argv
from os.path import isfile,join
import os

size_limit = argv[1]
my_path = "./"
onlyfiles = [f for f in listdir(my_path) if isfile(join(my_path, f))]
sizes = []
size_dir = {}
print size_limit
for item in onlyfiles:
    print type(os.path.getsize(my_path+item))
    if os.path.getsize(my_path+item) < size_limit:
        size_dir[item] = os.path.getsize(my_path+item)
print(size_dir)

Я запускаю эту программу в своем терминале:

python THISFILENAME.py 300

Как я и ожидал, size_limit получил 300 от моей команды ввода. В цикле for я устанавливаю оператор if, чтобы проверить, превышает ли файл size_limit, если нет, то мы добавляем файл в size_dir. Однако, когда я распечатываю size_dir, я обнаруживаю, что size_dir содержит все файлы в моем текущем каталоге, и это не то, что я ожидал.

Результат:

{'dir_print.py': 825, 'argvdemo.py': 215, 'formatter.py': 404}

Любая помощь приветствуется.

2
Ji Yang 17 Дек 2015 в 19:21

3 ответа

Лучший ответ

Когда вы читаете size_limit из аргументов командной строки, он читается как строка, а не как целое число. Затем вы сравниваете число со строкой в строке:

if os.path.getsize(my_path+item) < size_limit:
    ...

Когда вы сравниваете числовой тип с нечисловым типом в Python 2.x, числовой тип всегда меньше, чем другой тип в сравнении, поэтому строка выше всегда будет возвращать true . В Python 3.x ваше сравнение подняло бы TypeError.

Вы должны привести size_limit к целому числу, чтобы оно работало должным образом (обратите внимание на строку, где назначено size_limit).

from os import listdir,environ
from sys import argv
from os.path import isfile,join
import os

# Here I convert the argument you get to an integer
size_limit = int(argv[1])

my_path = "./"
onlyfiles = [f for f in listdir(my_path) if isfile(join(my_path, f))]
sizes = []
size_dir = {}
print size_limit
for item in onlyfiles:
    print type(os.path.getsize(my_path+item))

    if os.path.getsize(my_path+item) < size_limit:
        size_dir[item] = os.path.getsize(my_path+item)
print(size_dir)
0
wkl 17 Дек 2015 в 16:39

Преобразуйте ограничение размера в int:

size_limit = int(argv[1])
1
Mike Müller 17 Дек 2015 в 16:32

Название:

import os
nameList = os.listdir("path")

Размер (при условии, что у вас уже есть «nameList»:

statinfo = os.stat(nameList[index])
fileSize = statinfo.st_size
0
Mayuso 17 Дек 2015 в 16:28