TypeError: NoneType – Bei Verwendung von return zip_longest

Ich bekomme einen Typfehler für NoneType im Moment das ist (ich nehme an, wenn ich versuche, einen Wert in einer Funktion für zip_longest zurückzugeben)

Das Ziel meines Codes ist es, Bilddateien zu entfernen, die kleiner sind als "width = 400 AND height = 400" und dann alle verbleibenden Bilder in Ordner mit x Wert (wobei x später geändert werden kann). Derzeit scheint der Code zu funktionieren, aber ich bekomme das Problem, das ich erwähnt habe und möchte diesen Fehler verhindern.

Code:

# ======== grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx: def grouper(iterable, n, fillvalue=None): "Collect data into fixed-length chunks or blocks" # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n print(fillvalue) return zip_longest(*args, fillvalue=fillvalue) def makedirs(d): try: os.makedirs(d) except OSError as e: # If the file already exists, and is a directory if e.errno == errno.EEXIST and os.path.isdir(d): created = False # It's some other error, or the existing file is not a directory else: raise else: created = True return created def get_valid_filenames(directory, extensions): for filename in os.listdir(directory): if filename.lower().endswith(extensions): yield filename def get_too_small_image_filenames(directory, extensions=DEFAULT_IMAGE_EXTS, min_width=400, min_height=400): for filename in get_valid_filenames(directory, extensions): image_path = os.path.join(directory, filename) try: with open(image_path, 'rb') as filehandle: img = Image.open(filehandle) width, height = img.size except IOError, e: yield filename if (width < min_width) and (height < min_height): yield filename def confirm_it(directory, extensions, images_per_dir=500): # Confirm selection and move files to new sub-directory for too_small_filename in get_too_small_image_filenames(directory): os.remove(os.path.join(directory, too_small_filename)) valid_images = get_valid_filenames(directory, extensions) grouped_image_file_names = grouper(valid_images, images_per_dir) for subdir, image_filenames in enumerate(grouped_image_file_names): for filename in image_filenames: from_path = os.path.join(directory, filename) to_dir = os.path.join(directory, "Folder ("+str(subdir)+")") to_path = os.path.join(to_dir, filename) makedirs(to_dir) os.rename(from_path, to_path) def confirm_it_wrapper(): confirm_it(directory=folderPath.get(), extensions=extensions) 

Zurück verfolgen:

 Exception in Tkinter callback Traceback (most recent call last): File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__ return self.func(*args) File "C:\Users\Gavin\workspace\Test Projects\src\Test0.py", line 109, in confirm_it_wrapper confirm_it(directory=folderPath.get(), extensions=extensions) File "C:\Users\Gavin\workspace\Test Projects\src\Test0.py", line 99, in confirm_it from_path = os.path.join(directory, filename) File "C:\Python27\lib\ntpath.py", line 66, in join p_drive, p_path = splitdrive(p) File "C:\Python27\lib\ntpath.py", line 114, in splitdrive if len(p) > 1: TypeError: object of type 'NoneType' has no len() 

Zusatzinformation:

Wie erwähnt, glaube ich, dass es aus der Funktion kommt, die die "zip_longest" -Parameter zurückgibt, wobei der Fillvalue in der Erstellung auf "None" gesetzt ist. Irgendwie um das herum?

Vielen Dank.

  • 'NoneType' Objekt hat kein Attribut 'get'
  • Python idiom zum Anwenden einer Funktion nur, wenn Wert nicht Keine ist
  • AttributeError: 'KeinType' Objekt hat kein Attribut 'Löschen'
  • Wie erstelle ich Werte mit Keine im Pandas-Datenrahmen in Python?
  • TypeError: 'NoneType' Objekt ist in Python nicht iterierbar
  • Warum nicht len ​​(keine) Rückkehr 0?
  • One Solution collect form web for “TypeError: NoneType – Bei Verwendung von return zip_longest”

    Das Problem ist, dass die Anzahl der Dateien kein Vielfaches von images_per_dir , also wird die letzte Gruppe von images_per_dir Bildern mit None 's images_per_dir . trim_grouper() diese trim_grouper() Funktion deinem Code hinzu, um das zu trim_grouper() :

     from itertools import takewhile def trim_grouper(iterable, n, fillvalue=None): for group in grouper(iterable, n, fillvalue=fillvalue): yield tuple(takewhile((lambda x: x), group)) 

    Dann in confirm_it() ersetzen:

     grouped_image_file_names = grouper(valid_images, images_per_dir) 

    mit:

     grouped_image_file_names = trim_grouper(valid_images, images_per_dir) 

    Das sollte es tun.

    Python ist die beste Programmiersprache der Welt.