Tworzenie Dicta, gdzie kluczem jest rozszerzenie pliku, a nazwa pliku wartością w kluczu (dynamicznie, ze ścieżki pliku)

0

Witam, mam takie zadanko:

W folderze są pliki: tekst1.txt, tekst2.txt, program1.py, program2.py, plikjson.json.

  1. Wyswietlamy wszystkie nazwy plikow na konsoli.
  2. tworzymy jedna liste z nazwami wszystkich plikow.
  3. tworzymy dicta-> gdzie kluczem jest rozszerzenie pliku, a nazwa pliku wartoscia w kluczu. w przypadku gdy jest kilka tych samych rozszerzen-> to nazwy plikow (czyli wartosci w dicice) maja byc po przecinku.

Utknąłem na 3cim punkcie :/
Przeszukałem StackOverFlow - bezskutecznie.

Kod, który obecnie mam:

class Klasa(object):

def PlayingWithPython(self):

    path = "C:/Folder/"
    dirs = os.listdir(path)

    for file in dirs:
        pattern = re.match(r'(\w+)\.(\w+)', file)
        if pattern:
            print pattern.group(1)
            print pattern.group(2)
        '''Lista'''
    print dirs, "\n"

    dict = {pattern.group(1): pattern.group(2)}
    print dict

r = Klasa()
r.PlayingWithPython()

Python 2.7.15

1

Jeśli wartości słownika mogą być listami to możesz zrobić to w ten sposób:

dictionary = {}
for i in range(len(dirs)):
  dict.setdefault(dirs[i].split('.')[1], []).append(dirs[i].split('.')[0]))

Wersja z error handling:

dictionary = {}

for i in range(len(dirs)):
	try:
		key = dirs[i].split('.')[1]
		filename = dirs[i].split('.')[0]
		dictionary.setdefault(key, []).append(filename)
	except IndexError:
		print('No key or filename found.')

print(dictionary)
2
  1. Usun te klase -> nie potrzebujesz jej
  2. Nie uzywaj CamelCase do nazw metod w pythonie.
  3. Nie uzywaj Windowsa do Programowania w Pythonie :P
  4. Nie uzywaj regex-ow do parsowania plikow/sciezek/nazw_rozszerzen bo to bez sensu jest np: 'os'
  • np: co w wypadku jak odpalisz skrypt na Linuxie ktory ma np: folder o nazwie '.costamcostam' chyba sie posypie
  1. Nie nazywaj zmiennej tak jak typ wbudowany w Pythonie (jak juz musisz to zamiast file to uzyj file_ )
  2. Nie uzywaj Pythona 2.7 :P

W mojej opinii defaultdict jest wygodniejszy niz dict bo nie trzeba pamietac o "setdefault".
Tak czy siak sprowadza się to do mniej więcej tego samego.

Ogólnie trzymanie nazw plików jako string jest słabe i średnio ma sens zdecydowanie lepiej użyć listy.

import os
from collections import defaultdict


DIR_FILE_LIST = os.listdir("/jakas/tam/sciezka/")


def dir_report(dir_files):
    my_dir = defaultdict(str)
    for file_ in dir_files:
        filename, file_extension = os.path.splitext(file_)
        my_dir[file_extension] += filename + ','
    return my_dir


print(dir_report(dir_files=DIR_FILE_LIST))

PS: nazwy zmiennych sa 'z czapy'.

0

Dziękuję Panowie, jesteście wielcy.
Sporo przez to zrozumiałem :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1