Datei kopieren - for-Schleife Python - Python, Schleifen, kopieren

Guten Tag,

Ich habe hier einen Code, der ungefähr kopieren soll200 csv "s aus dem Quellordner in Zielordner basierend auf dem" Sektor ", zu dem sie gehören. Der Sektor, zu dem sie gehören, wird über die" symbolslist "identifiziert, die csvs mit einer Liste von Tickern enthält. Der Code funktioniert für die die meisten Teil, außer dass es die Liste der Ticker nimmtin der endgültigen csv in symbols liste und kopieren alle diese CSV "s in alle ziel ordner. Grundsätzlich muss ich irgendwie die erste for-schleife mit den 3 for loops darunter kombiniert, aber es ist schwer zu tun. Jegliche kommentare sind sehr geschätzt.

import os,sys,shutil
import glob
import pandas as pd

source_dir =  "C:TS"
dest_dir = "C:TSCombinedGroupsCross Asset Class"
#dest_dir = "C:TSCombinedcopytest"
base = "C:TSCombinedGroups"

dest_dirlist = (base +"/Cross Asset Class", base+"/Bonds", base + "/Commodities", 
base + "/Countries", base + "/Currencies", base + "/Industry Sectors", base + "/Segments and Styles", 
base + "/Us Sectors", base + "Volatilities")
print(dest_dirlist)

symbolslist = (base+"/Cross Asset Class.csv", base+"/Bonds.csv",base+"/Commodities.csv" 
,base+"/Currencies.csv", base+"/Industry Sectors.csv", base+"/Segments and Styles.csv", 
base+"/US Sectors.csv")


for file in symbolslist:
print(file)
df_symbolslist = pd.read_csv(file)
print(df_symbolslist)


for ticker_file in glob.glob(os.path.join(source_dir, "*.csv*")):
for ticker in df_symbolslist["Ticker"]:
print(ticker)
if ticker in ticker_file:
for path in dest_dirlist:
shutil.copy(ticker_file, path)
print(ticker + " File Copied")

Vielen Dank für Ihre Zeit.

Antworten:

0 für die Antwort № 1

Wenn ich das Problem richtig verstehe, denke ich, dass Sie einem etwas anderen Ansatz folgen sollten. Sie können ein erstellen dict Damit werden Ticker der Liste der Asset-Klassen zugeordnet, zu denen sie gehört. Dann hast du die Karte um Dateien zu kopieren. Ich glaube nicht, dass Pandas hier helfen - Sie können die Karte Zeile für Zeile mit dem Standard-CSV-Modul erstellen.

Ich habe diesen Code nicht getestet, weil ich keinen richtigen Datensatz habe, aber denke darüber nach:

import os,sys,shutil
import glob
import csv
import collections

source_dir =  r"C:TS"
dest_dir = r"C:TSCombinedGroupsCross Asset Class"
#dest_dir = r"C:TSCombinedcopytest"
base = r"C:TSCombinedGroups"

# asset classes of interest
asset_classes = ("Cross Asset Class", "Bonds", "Commodities",
"Countries", "Currencies", "Industry Sectors", "Segments and Styles",
"Us Sectors", "Volatilities")

# asset class directories indexed by class
dest_dir_index = {asset_class.upper():os.path.join(base, asset_class)
for asset_class in asset_classes}
print(dest_dir_index)

# make sure destination dirs exist
for dir_name in dest_dir_index.values():
if not os.path.isdir(dir_name):
os.mkdir(dir_name)

# dict that creates key:[classes...] item when first accessed, used to keep
# list of asset classes for each ticker symbol.
ticker_to_class_index = collections.defaultdict(list)

for asset_class in asset_classes:
symbolcsv = "{}.csv".format(os.path.join(base, asset_class))
print(symbolcsv)
with open(symbolcsv, newline="") as fp:
reader = csv.reader(fp)
next(fp) # skip header
for sectors, ticker in reader:
ticker_to_class_index[ticker.upper()].append(asset_class)

# split ticker out of csv filenames and copy file to all asset classes
# mapped for that ticker.
for ticker_file in glob.glob(os.path.join(source_dir, "*.csv*")):
ticker = os.path.splitext(os.path.basename(ticker_file)).upper()
print(ticker)
for asset_class in ticker_to_class_map[ticker.upper()]:
dest_dir = dest_dir_index[asset_class]
shutil.copy(ticker_file, dest_dir)
print("{} copied to {}".format(ticker_file, dest_dir))