Wyciągnięcie pliku z wielu ścieżek

0

Hej, Czy ktoś z Was może wie w jaki sposób można skrócić ten kod:

running_path = r'ścieżka do pliku
folders = os.listdir(running_path)
folders = [f for f in folders if f.isnumeric() == True if len(f) == 4 if f[:2]  == '20']
folders.sort()
year = folders[-1]
running_path = '{}\{}'.format(running_path,year)
folders = os.listdir(running_path)
folders = [m for m in folders if m[:2].isnumeric()]
folders.sort()
month = folders[-1]
running_path = '{}\{}'.format(running_path,month)
folders = os.listdir(running_path)
folders = [w for w in folders if 'Week' in w]
folders.sort()
week = folders[-1]
running_path = '{}'\'{}'.format(running_path, week)
files = os.listdir(running_path)
files
1

Znacznie prościej niż analizowanie twego kodu oraz zgadywanie formatu plików będzie poczekać kiedy zdecydujesz się opisać co chcesz uzyskać.
Np:

import glob
import itertools
import datetime

path=r'C:\App\Python\test'
oneday=datetime.timedelta(days=1)
today=datetime.date.today()
max_days_back=90
lst=None
for n in range (0,max_days_back):
    lst=glob.glob((today-n*oneday).strftime(path+"\%Y\%m\%d\*.*"))
    if len(lst)>0:
        break
    
if lst!=None:
    print(lst)

lub to samo:

import glob
import itertools
import datetime

path=r'C:\App\Python\test'
oneday=datetime.timedelta(days=1)
today=datetime.date.today()
max_days_back=90
lst=next(filter(lambda lst:len(lst)>0,[glob.glob((today-n*oneday).strftime(path+"\%Y\%m\%d\*.*")) for n in range (0,max_days_back)]),None)
print(lst)
4
Anna Rybińska napisał(a):

Hej, Czy ktoś z Was może wie w jaki sposób można skrócić ten kod:

running_path = r'ścieżka do pliku
folders = os.listdir(running_path)
folders = [f for f in folders if f.isnumeric() == True if len(f) == 4 if f[:2]  == '20']
folders.sort()
year = folders[-1]
running_path = '{}\{}'.format(running_path,year)
folders = os.listdir(running_path)
folders = [m for m in folders if m[:2].isnumeric()]
folders.sort()
month = folders[-1]
running_path = '{}\{}'.format(running_path,month)
folders = os.listdir(running_path)
folders = [w for w in folders if 'Week' in w]
folders.sort()
week = folders[-1]
running_path = '{}'\'{}'.format(running_path, week)
files = os.listdir(running_path)
files

Czy skrócić to nie wiem czy to dobry pomysł, ale na pewno pasowałoby go zrefaktorować, bo ja czytam ten kod i nie mam bladego pojęcia co on ma robić. Coś z sortowaniem folderów po dacie, ale nie wiem dokładnie co.

  1. Pierwsze co zauważam do poprawy, to chyba to że wołanie .sort() tutaj jest tylko i wyłącznie po to żeby zwrócić folders[-1], czyli ostatni element, tak? To można by skrócić.

Na razie zrefaktorowałem to do takiej postaci. Implementacje last_element() można poprawić.

from os import listdir

def x(path: str) -> list[str]:
    path_year = fr'{path}\{last_year(path)}'
    path_month = fr'{path_year}\{last_month(path_year)}'
    path_week = fr'{path_month}\{last_week(path_month)}'

    return listdir(path_week)


def last_year(path: str) -> str:
    return last_element([year for year in listdir(path) if year.isnumeric() and len(year) == 4 and year[:2] == '20'])


def last_month(path: str) -> str:
    return last_element([month for month in listdir(path) if month[:2].isnumeric()])


def last_week(path: str) -> str:
    return last_element([week for week in listdir(path) if "Week" in week])


def last_element(folders: list) -> str:
    folders.sort()
    return folders[-1]
0
Riddle napisał(a):

Czy skrócić to nie wiem czy to dobry pomysł, ale na pewno pasowałoby go zrefaktorować, bo ja czytam ten kod i nie mam bladego pojęcia co on ma robić. Coś z sortowaniem folderów po dacie, ale nie wiem dokładnie co.

ten kod ma zwrócić 3 pliki, które sa ukryte folder w folderze. Czy folder a jest główny, potem w tym folderze jest kilka innych a kod ma zwrócić konkretnie folder z rokiem, w tym folderze ma znaleźć folder z miesiącem, potem kolejny ma znaleźć folder z nazwą c, następnie folder z tygodniem i wygiągnąć z tego ostatniego 3 pliki.

0
Anna Rybińska napisał(a):

ten kod ma zwrócić 3 pliki, które sa ukryte folder w folderze. Czy folder a jest główny, potem w tym folderze jest kilka innych a kod ma zwrócić konkretnie folder z rokiem, w tym folderze ma znaleźć folder z miesiącem, potem kolejny ma znaleźć folder z nazwą c, następnie folder z tygodniem i wygiągnąć z tego ostatniego 3 pliki.

Czyli zaczynamy od running_path?
Szukamy ostatnią rok, w nim ostatni miesiąc, w nim ostatni dzień?
Czy nie prościej od dnia dzisiejszego sprawdzać running_path+'/'+year+'/'+month+'/'+day/ jak takiego nie ma to cofany się o jeden dzień?

1
Anna Rybińska napisał(a):
Riddle napisał(a):

Czy skrócić to nie wiem czy to dobry pomysł, ale na pewno pasowałoby go zrefaktorować, bo ja czytam ten kod i nie mam bladego pojęcia co on ma robić. Coś z sortowaniem folderów po dacie, ale nie wiem dokładnie co.

ten kod ma zwrócić 3 pliki, które sa ukryte folder w folderze. Czy folder a jest główny, potem w tym folderze jest kilka innych a kod ma zwrócić konkretnie folder z rokiem, w tym folderze ma znaleźć folder z miesiącem, potem kolejny ma znaleźć folder z nazwą c, następnie folder z tygodniem i wygiągnąć z tego ostatniego 3 pliki.

No to skoro tak to moja zrefaktorowana wersja już jest okej. I nie sądzę że da się ją bardziej uprościć.

0

Hej. Mam pytanie czy wiecie może jak wyciągnąć plik z takiej ścieżki i aby ta ścieżka nie była zależna od roku, msc i tygodnia. Chodzi mi o to, żeby była uniwersalna.

File = f'//C:/GLOB/FC3/GBP/2023/01 January/04 Black/Week 5/data.xlsx

próbowałam tak, ale nie działa: f'//C:/GLOB/FC3/GBP/%Y/%m/04 Black/%W/data.xlsx

0
Anna Rybińska napisał(a):

Hej. Mam pytanie czy wiecie może jak wyciągnąć plik z takiej ścieżki i aby ta ścieżka nie była zależna od roku, msc i tygodnia. Chodzi mi o to, żeby była uniwersalna.

File = f'//C:/GLOB/FC3/GBP/2023/01 January/04 Black/Week 5/data.xlsx

próbowałam tak, ale nie działa: f'//C:/GLOB/FC3/GBP/%Y/%m/04 Black/%W/data.xlsx

No to już jest trochę więcej zachodu, tzn musiałabyś rozbić ścieżkę po separatorze, iterować po poszczególnych elementach, i sprawdzić, jeśli jest jednym z ciągów %Y, %m, %W to wyciągnąć ostatni folder, a jeśli jest ścieżką to "wejść" do niej.

Dodatkowo musiałabyś obsłużyć przypadek, np co jeśli nie ma takiego folderu w ogóle; oraz co gdyby figury pojawiły się w masce w odwrotnej kolejności, np /GBP/%m/%Y.

Więc to nie będzie takie proste.

0

@Anna Rybińska Powiedz mi jaki potwór programowania zrobił tak pokręcone ścieżki?
Czy to windows czy linux czy też chcesz aby było przenośnie?

0

Można użyć modułu pathlib i rekursywnego globa. Taka ścieżka z pathliba ma masę metod, które upraszczają życie.

from pathlib import Path

running_path= Path(r'C:\Star\Dir\Foo')

for file in running_path.rglob('*/SEQ0/*.txt'):
    print(f'{file = } {file.as_posix() = }')
0
yarel napisał(a):

Można użyć modułu pathlib i rekursywnego globa. Taka ścieżka z pathliba ma masę metod, które upraszczają życie.

from pathlib import Path

running_path= Path(r'C:\Star\Dir\Foo')

for file in running_path.rglob('*/SEQ0/*.txt'):
    print(f'{file = } {file.as_posix() = }')

No pomysł fajny, tylko autor wątku chce wyciągnąć tylko pliki z ostatniego roku, ostatniego miesiąca i ostatniego tygodnia jaki jest w tych plikach.

0

Hejka czy wiecie może jak przerobic cos takiego na latwy skrypt:

IF(And(F2="a", G2="b"),
IF(OR(IFERROR(SEARCH("U",LEFT(L2)-5),0),IFERROR(SEARCH("P",LEFT(L2)-5),0),IFERROR(SEARCH("K",LEFT(L2)-5),0),IFERROR(SEARCH("S",LEFT(L2)-5),0), IFERROR(SEARCH("B",LEFT(L2)-5),0), IFERROR(SEARCH("D",LEFT(L2)-5),0)),IF(S2>0,IF(R2="x", "Bla","Ble"),"c")"non"), IF(AND(F2="x2", G2='Y'), IF(S2>0, "not read", "read"), IF(AND(F2="p", G2="e"), IF(S2=0, IF(R2="CB", "SA", "Read-p")"Read-c"), IF(AND(F2="p", G2="need")"FM","N/A"))))
0

Ja nic z tego nie rozumiem, skąd ten kod pochodzi w ogóle?

0
CloudPro napisał(a):

Ja nic z tego nie rozumiem, skąd ten kod pochodzi w ogóle?

Kod pochodzi z exela i jest rto zagiezdzenie funkcji

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