J'ai un script qui s'exécute tous les jours et qui génère un fichier CSV avec un tas de lignes.
Exemple:
CSV aujourd'hui:
import csv
from datetime import date, timedelta
# Setting Dates
today = date.today()
yesterday = today - timedelta(days = 1)
# Setting files with Dates
currentFile = "ap-inventory_" + today.strftime('%m-%d-%Y') + ".csv"
yesterdayFile = "ap-inventory_" + yesterday.strftime('%m-%d-%Y') + ".csv"
with open('master.csv', 'rt') as master:
master_indices = dict((r[1], i) for i, r in enumerate(csv.reader(master)))
with open(currentFile, 'rt') as hosts:
with open(yesterdayFile, 'wt') as results:
reader = csv.reader(hosts)
writer = csv.writer(results)
writer.writerow(next(reader, []) + ['RESULTS'])
for row in reader:
index = master_indices.get(row[3])
if index is not None:
message = 'FOUND in master list (row {})'.format(index)
else:
message = 'NOT FOUND in master list'
writer.writerow(row + [message])
CSV hier:
import pandas as pd
import csv
from datetime import date, timedelta
# Setting Dates
today = date.today()
yesterday = today - timedelta(days = 1)
# Setting files with Dates
currentFile = "ap-inventory_" + today.strftime('%m-%d-%Y') + ".csv"
yesterdayFile = "ap-inventory_" + yesterday.strftime('%m-%d-%Y') + ".csv"
J'essaie d'obtenir un script qui compare le fichier généré aujourd'hui, avec hier, puis renvoie UNIQUEMENT les doublons dans un nouveau fichier CSV. (si possible, comparez uniquement la section MacAddress, de cette façon la date ne supprimera pas tout de la dernière colonne)
J'ai trouvé des dizaines et des dizaines de des articles et des questions similaires à celui-ci, mais la majorité d'entre eux font le contraire (en supprimant les doublons) et je ne peux pas les faire fonctionner pour une raison ou une autre.
Quelqu'un peut-il me diriger dans la bonne direction s'il vous plaît?
Résultat souhaité (quelque chose de similaire):
Access Point,MacAddress,Status,Site,Date AP03 - 1695,5c5b352e3c9b,Disconnected,Store 1695,08-21-2019 AP01 - 0099,5c5b352e44b1,Disconnected,Store 0099,08-21-2019 AP07 - 1961,5c5b350eeae9,Disconnected,Store 1961,08-21-2019 AP05 - 3165,5c5b352e1f04,Disconnected,Store 3165,08-21-2019 AP06 - 1057,5c5b352e1ed7,Disconnected,Store 1057,08-21-2019 AP01 - 2700,5c5b353e444d,Disconnected,Store 2700,08-21-2019 AP02 - 2700,5c5b352ea519,Disconnected,Store 2700,08-21-2019
J'ai essayé tellement de variantes pour que cela fonctionne, je viens de un script minimaliste pour le moment pour cette tâche, car je ne suis pas sûr de la meilleure méthode pour commencer.
Access Point,MacAddress,Status,Site,Date AP03 - 1695,5c5b352e3c9b,Disconnected,Store 1695,08-20-2019 AP01 - 0099,5c5b352e44b1,Disconnected,Store 0099,08-20-2019 AP07 - 1961,5c5b350eeae9,Disconnected,Store 1961,08-20-2019 AP05 - 3165,5c5b352e1f04,Disconnected,Store 3165,08-20-2019 AP02 - 1161,5c5b352e4484,Disconnected,Store 1161,08-20-2019 AP05 - 0249,5c5b352e40c9,Disconnected,Store 0249,08-20-2019 AP06 - 1057,5c5b352e1ed7,Disconnected,Store 1057,08-20-2019 AP01 - 2700,5c5b353e444d,Disconnected,Store 2700,08-20-2019 AP02 - 2700,5c5b352ea519,Disconnected,Store 2700,08-20-2019 AP06 - 0415,5c5b352ebdce,Disconnected,Store 0415,08-20-2019 AP03 - 2542,5c5b353e3e94,Disconnected,Store 2542,08-20-2019 AP03 - 0788,5c5b353e1216,Disconnected,Store 0788,08-20-2019 AP04 - 0788,5c5b353e11e9,Disconnected,Store 0788,08-20-2019 AP05 - 0788,5c5b353e122a,Disconnected,Store 0788,08-20-2019 AP06 - 0788,5c5b353e1220,Disconnected,Store 0788,08-20-2019 AP01 - 1366,5c5b353e136a,Disconnected,Store 1366,08-20-2019 AP05 - 0671,5c5b352eb7ed,Disconnected,Store 0671,08-20-2019
C'était le plus loin que j'aie obtenu, mais je n'ai jamais réussi à comparer correctement les résultats
Access Point,MacAddress,Status,Site,Date AP03 - 1695,5c5b352e3c9b,Disconnected,Store 1695,08-21-2019 AP01 - 0099,5c5b352e44b1,Disconnected,Store 0099,08-21-2019 AP07 - 1961,5c5b350eeae9,Disconnected,Store 1961,08-21-2019 AP05 - 3165,5c5b352e1f04,Disconnected,Store 3165,08-21-2019 AP02 - 1161,5c5b352e4484,Disconnected,Store 1161,08-21-2019 AP05 - 0249,5c5b352e40c9,Disconnected,Store 0249,08-21-2019 AP06 - 1057,5c5b352e1ed7,Disconnected,Store 1057,08-21-2019 AP01 - 2700,5c5b353e444d,Disconnected,Store 2700,08-21-2019 AP02 - 2700,5c5b352ea519,Disconnected,Store 2700,08-21-2019 AP02 - 2722,5c5b352eb446,Disconnected,Store 2722,08-21-2019
3 Réponses :
Sans pandas, vous pouvez utiliser quelque chose comme:
common = [f"{x},{date_today}" for x in list(set(today) & set(yesterday))]
La sortie souhaitée (quelque chose de similaire) est:
Access Point,MacAddress,Status,Site,Date AP05 - 3165,5c5b352e1f04,Disconnected,Store 3165,08-21-2019 AP07 - 1961,5c5b350eeae9,Disconnected,Store 1961,08-21-2019 AP02 - 1161,5c5b352e4484,Disconnected,Store 1161,08-21-2019 AP03 - 1695,5c5b352e3c9b,Disconnected,Store 1695,08-21-2019 AP02 - 2700,5c5b352ea519,Disconnected,Store 2700,08-21-2019 AP05 - 0249,5c5b352e40c9,Disconnected,Store 0249,08-21-2019 AP06 - 1057,5c5b352e1ed7,Disconnected,Store 1057,08-21-2019 AP01 - 0099,5c5b352e44b1,Disconnected,Store 0099,08-21-2019 AP01 - 2700,5c5b353e444d,Disconnected,Store 2700,08-21-2019
Quels sont les éléments communs (sans date) entre les fichiers hier.csv et today.csv .
Démo
Explication de
import time
with open("yesterday.csv") as f1, open("today.csv") as f2, open("output.csv", "w+") as out:
yesterday = []
for line in list(f1)[1:]:
yesterday.append(",".join(line.split(",")[:-1]))
today = []
for line in list(f2)[1:]:
today.append(",".join(line.split(",")[:-1]))
date_today = time.strftime('%m-%d-%Y')
common = [f"{x},{date_today}" for x in list(set(today) & set(yesterday))]
header = "Access Point,MacAddress,Status,Site,Date"
out.write(f"{header}\n")
for o in common:
out.write(f"{o}\n")
f "{var}" - s'appelle une f-string list (set (aujourd'hui) & set (hier) - donnez-nous les éléments communs entre les listes [x pour x dans la liste] est appelé un compréhension de liste C'est parfait - et tellement plus facile que d'utiliser Pandas. Merci beaucoup!
Question d'apprentissage rapide - à quoi correspond exactement la ligne avec date_today (je l'ai obtenue pour obtenir la date d'aujourd'hui et la formater, mais je ne sais pas pourquoi nous l'utilisons complètement). Je vois son appelé dans la ligne «commun», mais je n'ai jamais vu cette syntaxe utilisée.
J'ai posté une petite explication de common = [f "{x}, {date_today}" pour x dans la liste (set (aujourd'hui) et set (hier))] . Je suis désolé de ne pas pouvoir commenter tout le code mais le temps presse!
Un moyen de le faire avec les pandas serait le suivant:
df_combined[duplicates].to_csv("duplicates_only.csv")
les doublons est maintenant une structure booléenne que vous pouvez utiliser pour l'indexation dans le dataframe.
df_combined[duplicates]
Vous pouvez l'enregistrer dans un nouveau fichier.
import pandas as pd
df1 = pd.read_csv("your_file_from_yesterday.csv")
df2 = pd.read_csv("your_file_from_today.csv")
df_combined = pd.concat([df1,df2], axis=0)
duplicates = df_combined["your_column_of_interest"].duplicated(keep="last")
#keep="first" if you want the addresses from yesterday that were duplicated.
docs pour pd. dupliqué () , pd.concat , pd.read_csv () a >
Les lignes ne sont pas égales, la date change.
Vous ne savez pas ce que vous voulez dire à propos des lignes ne sont pas égaux, mais la modification des dates ne devrait pas être un problème si vous recherchez des doublons dans MacAddress. J'ai édité pour plus de clarté et pour démontrer la sortie.
Je pense que j'ai trouvé une solution en utilisant des pandas.
df1 = pd.read_csv('DataSources/file_today.csv')
df2 = pd.read_csv('DataSources/file_tomorrow.csv')
df = pd.concat([df1, df2])
df = df.sort_values(['MacAddress','Date'])
new_df = df.drop_duplicates(['MacAddress'], keep ='first')
drop_df = df.merge(new_df, how = 'outer' ,indicator=True).loc[lambda x : x['_merge']=='left_only']
# your result
drop_df
Veuillez un MCVE de votre script afin que nous puissions le corriger pour faire ce que vous voulez plutôt que d'écrire un tout nouveau script que vous ne pouvez pas utiliser car il ne suit pas le même format de votre script actuel.
@EdekiOkoh J'ai essayé tellement de variantes différentes pour que cela fonctionne, de la simple utilisation de la bibliothèque CSV à l'utilisation de Pandas. Je suis actuellement de retour à la première étape car je ne connais même pas la meilleure méthode pour commencer.
Juste un fyi. À moins que vous ne publiiez un script ou quelque chose avec lequel nous pouvons travailler, la plupart des gens l'ignoreront. Vous ne pouvez pas vous attendre à ce que nous mettions plus de travail dans votre réponse que ce que vous donnez dans votre question. Publiez celui qui vous a le plus rapproché de ce que vous vouliez.
@EdekiOkoh J'ai posté les bare-bones, mais rien dessus. Je comprends d'où tu viens tho. Permettez-moi de revenir sur mon projet pour vous donner (et à d'autres) plus de travail.