File1.csv
import csv
with open('File1.csv', 'r') as csv_file, open('File2.csv', 'r', newline='') as csv_file2 \
,open('output.csv', 'w', newline='') as new_file:
csv_reader = csv.DictReader(csv_file)
csv_reader2 = csv.DictReader(csv_file2)
csv_writer = csv.writer(new_file)
csv_writer.writerow([ 'column1', 'column2', 'column3'])
for row1 in csv_reader:
for row2 in csv_reader2:
if row1['column3'] == row2['book1']:
row1[ 'column3' ] = row2['book2']
csv_writer.writerow(dict(row1).values())
File2.csv
column1, column2, column3 hello,halo,10 hello2,halo2,20 hello23,halo3,20
Output.csv
book1,book2 20A,10 50A,20
Je compare le fichier entre File1 et File2 . Si la valeur de File1 - column3 correspond à la valeur de File2 - book1 , copiez la valeur File2 - book2 et remplacez-la par File1 - colonne3 . Le résultat attendu est le Output.csv
Jusqu'à présent, je me réfère à d'autres ressources et j'ai essayé ceci
column1,column2,column3 hello,halo,20A hello2,halo2,50A hello3,halo3,50A
Le result remplace toute la valeur File1 sans comparaison. Je ne sais pas quelle partie ne va pas.
J'ai mis à jour le fichier csv et la sortie attendue
4 Réponses :
Outre le problème d'espacement mentionné par @Kamal Nayan, voici une implémentation plus simple qui itère sur les deux csv_reader en même temps:
column1,column2,column3 hello,halo,10 hello2,halo2,20
Résultat:
import csv
with open('File1.csv', 'r') as csv_file, open('File2.csv', 'r', newline='') as csv_file2 \
,open('output.csv', 'w', newline='') as new_file:
csv_reader = csv.DictReader(csv_file)
csv_reader2 = csv.DictReader(csv_file2)
csv_writer = csv.writer(new_file)
csv_writer.writerow([ 'column1', 'column2', 'column3'])
for row1,row2 in zip(csv_reader,csv_reader2):
csv_writer.writerow([row1['column1'],row1['column2'],row2['book2']])
Le lien est 404 . Mais j'ai essayé votre code. Même chose avec mon code, il n'a pas comparé la valeur. Comme exemple, si la valeur de la troisième ligne de column3 est toujours 50A . Le résultat doit également être 20 .
Correction du lien. À quoi la sortie est-elle censée ressembler si les valeurs de column3 et book1 ne correspondent pas?
il continuera à vérifier la valeur des autres jusqu'à ce qu'elle corresponde.
Et s'il n'y a pas du tout de correspondance?
il mettra 0 pour cela.
Je choisirais d'utiliser le module csv avec une approche try-except:
example1.csv:
equal values: 20A, 20A equal values: 50A, 50A
example2.csv:
import csv
reader1 = csv.reader(open('example2.csv', 'r'), delimiter=',', quotechar='"')
next(reader1, None) # skipping the headers
reader2 = csv.reader(open('example1.csv', 'r'), delimiter=',', quotechar='"')
next(reader2, None) # skipping the headers
while True:
try:
row1 = next(reader1)
row2 = next(reader2)
if (row1[2].strip() == row2[0].strip()):
print("equal values: {}, {}".format(row1[2].strip(), row2[0].strip()))
else:
print("different values")
except StopIteration:
break
column1, column2, column3 hello, halo, 20A hello2, halo2, 50A
book1, book2 20A, 10 50A, 20
Vous pouvez utiliser des pandas pour cela. L'opération que vous voulez faire s'appelle une jointure.
column1 column2 column3 0 hallo halo 10 1 hallo halo 20
La dernière étape consiste uniquement à renommer la dernière colonne.
import pandas as pd
f1 = pd.read_csv("File1.csv", delimiter=';')
f2 = pd.read_csv("File2.csv", delimiter=';')
tmp = pd.merge(f1, f2, left_on='column3', right_on='book1')[['column1', 'column2', 'book2']]
tmp = tmp.rename(columns={'book2': 'column3'})
print(tmp)
Puisque vous êtes nouveau dans Python, je vous suggère également d'apprendre à utiliser les pandas, ce qui rend le traitement des fichiers csv très facile et intuitif. Cette réponse n'est qu'une suggestion pour une méthode alternative. Vous pouvez également obtenir les résultats souhaités dans les pandas comme suit:
import pandas as pd
# Read the files
df1=pd.read_csv('File1.csv')
df2=pd.read_csv('File2.csv')
# Merge the two dataframes(tables)
result=pd.merge(df1,df2,left_on=['column3'],right_on=['book1'])
# Delete the unwanted columns (because merge returns both column3 and book1)
result.drop(columns=['column3','book1'],inplace=True)
# Rename the column book2 to column3
result.rename(columns={'book2':'column3'},inplace=True)
'''
Final result looks like this
column1, column2, column3
hello,halo,10
hello2,halo2,20
'''
Vous pouvez utiliser print (result.head ()) pour voir le résultat final. Il y a beaucoup de support sur SO pour les pandas et leur documentation contient également de nombreux exemples. Ce serait bien d'envisager d'apprendre les pandas si cela vous intéresse.
Voici les liens vers la documentation des fonctions que j'ai utilisées dans le code:
@raxowogeh C'est exactement le même code pour votre édition. Je suggérerais d'utiliser le lien pour fusionner et lire à ce sujet. Ce lien traite en détail de diverses fusions / jointures. Veuillez vous y référer.
Pourquoi n'utilisez-vous pas de pandas?
Je suis assez nouveau en python. Je viens d'apprendre des bases de lecture et d'écriture de csv.
Votre programme va bien, vous avez un problème dans les fichiers csv. Vous donnez des espaces après la virgule, ce n'est pas nécessaire. Donc, soit vous supprimez les espaces inutiles des fichiers csv, soit vous coupez les espaces dans votre programme
@KamalNayan oh .... Je donne l'espace parce que vous permettez à vous de le lire facilement. Je le change maintenant