2017-03-22 5 views
1

Guten Tag,Datei kopieren - für Schleife Python

Ich habe einige Code hier das gemeint ist, etwa 200 csv die aus dem Quellordner in den Zielordner auf dem „Sektor“ Basis zu kopieren, dass 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 den meist Teil, außer dass es die Liste der Ticker in der endgültigen CSV in Symbolliste nimmt und alle diese CSVs in alle Zielordner kopiert. Grundsätzlich muss ich irgendwie die erste for-Schleife mit den 3 for-Schleifen darunter kombinieren, aber es fällt mir schwer, das zu tun. Alle Kommentare werden sehr geschätzt.

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

source_dir = 'C:\TS' 
dest_dir = 'C:\TS\Combined\Groups\Cross Asset Class' 
#dest_dir = 'C:\TS\Combined\copytest' 
base = 'C:\TS\Combined\Groups' 

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.

+0

'df_symbolslist = pd.read_csv (Datei)' hält overwritting 'df_symobolslist'. Sie bearbeiten nur die letzte. Ich bin verwirrt über das Format hier ... Wie sehen die CSV-Symbole aus? Wie kodieren sie Sektor und Symbole? – tdelaney

+0

Dies ist, was die symbollist csvs aussehen: http://prntscr.com/en97is – user7669093

+0

Dies ist, was die csvs zu kopieren aussehen. http://prntscr.com/en98d2 – user7669093

Antwort

0

Wenn ich das Problem richtig verstehe, denke ich, dass Sie einen etwas anderen Ansatz folgen sollten. Sie können eine dict erstellen, die Ticker der Liste der Assetklassen zuordnet, 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 diesen Code nicht getestet, weil ich, keine richtige Datensatz haben aber bedenken Sie dies zu tun:

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

source_dir = r'C:\TS' 
dest_dir = r'C:\TS\Combined\Groups\Cross Asset Class' 
#dest_dir = r'C:\TS\Combined\copytest' 
base = r'C:\TS\Combined\Groups' 

# 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)) 
+0

Vielen Dank Tdelaney. Lass mich es versuchen. Auch hier ist ein Dropbox-Link, wie meine csvs aussehen. Http://www.dropbox.com/s/iqbt3pa6qiz70vg/Cross%20Asset%20Class.csv? Dl = 0 – user7669093

+0

Und er ist der Typ der Datei, die ich versuche Kopieren. https://www.dropbox.com/s/vusdpn8oizcda82/XLY.csv?dl=0 – user7669093

+0

Gab es eine Aufnahme, aber es scheint nicht, die "oberen" in Zeile 49 oder 51 zu mögen. Geben Sie mir einen Tupel-Fehler: ticker = os.path.splitext (os.path.basename (ticker_file)). upper() AttributeError: 'tuple' -Objekt hat kein Attribut 'upper' – user7669093