Может кто-нибудь объяснить, что означает ValueError: недостаточно значений для распаковки (ожидаемое 2, полученное 1) и как это исправить? - PullRequest
0 голосов
/ 04 марта 2020

Я делал сценарий, который переименовывает файлы из данного каталога в «CoronaVirus», и при тестировании я заметил, что он делает это только в данном каталоге, а не в его подпапках. Код выглядит примерно так (примечание: этот работает):

import os

PRF = input("Input Directory: ")

def main():

for file in PRF:
    for filename in os.listdir(PRF):
          i = 0
          dst = "CoronaVirus" + str(i)
          src = PRF + filename
          dst = PRF + dst
          os.rename(src , dst)
          i += 1
if __name__ == "__main__"":
    main()

После того, как я увидел, что он проходит только по указанному каталогу, я попытался добавить новый оператор (извините, если это не так, как он называется ) вызвал subdir, думая, что это заставит его смотреть через папки. Это заставило код выглядеть так:

import os

PRF = input("Input Directory: ")

def main():

for subdir , file in PRF:
    for filename in os.listdir(PRF):
           i = 0
           dst = "CoronaVirus" + str(i)
           src = PRF + filename
           dst = PRF + dst
           os.rename(src , dst)
           i += 1
if __name__ == "__main__"":
    main()

Но, похоже, это не сработает, поскольку выдает эту ошибку:

Traceback (most recent call last):
File "C:/Users/Acer/Desktop/Python/Pyinstaller/OSM.py", line 17, in <module>
main()
File "C:/Users/Acer/Desktop/Python/Pyinstaller/OSM.py", line 7, in main
for  subdir , file in PRF:
ValueError: not enough values to unpack (expected 2, got 1)

Может кто-нибудь объяснить, почему это происходит? Я новичок и хотел бы избежать этой проблемы в будущем. Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 марта 2020

Вход, PRF, не является кортежем, содержащим 2 значения, что ожидается для l oop:

for subdir , file in PRF:

Далее, os.listdir(PRF) требует строку в качестве аргумента, поэтому PRF не может быть одновременно строкой и кортежем.

Я полагаю, что вам нужно следующее:

import os

PRF = input("Input Directory: ") # this should be a string that represents a directory

def main():
    # get a list of files within that directory
    files = [f for f in os.listdir(PRF) if os.path.isfile(f)]
    # loop through files
    for filename in files:
        i = 0
        dst = "CoronaVirus" + str(i)
        src = PRF + filename
        dst = PRF + dst
        os.rename(src , dst)
        i += 1
if __name__ == "__main__""
   main()

Смотрите здесь, как задать переменную files: Список файлов в каталоге

0 голосов
/ 04 марта 2020

Если вы хотите, чтобы это было go через текущий каталог и все подкаталоги, я бы использовал os.walk

Я не уверен точно, в каком порядке это будет go через файлы, но по крайней мере это go будет проходить через них все.

Мне также пришлось удалить i = 0 из l oop и добавить что-то, обеспечивающее сохранение расширения

Если есть zip-файлы, вам, вероятно, следует сначала извлечь их в папку, так как они не будут выглядеть в них, а вместо этого назовите папку zip 'CoronaVirusN.zip'

, которую я вставил в if, чтобы исключить файлы zip

PRF = 'C:\\Users\\ALi\\OneDrive\\StackOverflow\\Test'

i = 0
for subdir, dirs, files in os.walk(PRF):
    for file in files:
        extension = file.split('.')[1]
        if extension != 'zip':
            dst = "CoronaVirus" + str(i) + '.' + extension
            src = subdir + '\\' + file
            dst = subdir + '\\' + dst
            os.rename(src , dst)
            i += 1
...