Nous allons voir dans cette partie comment nous pouvons manipuler des fichiers CSV avec Python.
Tout d'abord, CSV est l'acronyme de Comma Separated Vaues, c'est-à-dire Valeurs Séparées par des Virgules. Tous les fichiers CSV sont du texte brut, contenant des caractères alphanumériques et structurent les données qu'ils contiennent sous la forme de tableaux. Il ne faut pas confondre les fichiers Excel avec des fichiers CSV, même si leur aspect est identique une fois ouverts dans Excel, les fichiers CSV ne connaissent pas les types de données, le formattage et la présentation, et bien d'autres choses.
Il existe des bibliothèques Python spécifiques pour manipuler les fichiers Excel, que vous pourrez trouver ici et encore ici.
Le format CSV est utilisé généralement pour échanger des données, en particulier quand il y en a beaucoup, entre des applications différentes. Les gestionnaires de base de données, les logiciels d'analyse statistique et d'autres applications qui enregistrent beaucoup de données (comme des contact ou des informations client) utilisent généralement ce format pour communiquer.
Voyons comment ouvrir et manipuler un fichier CSV avec les bibliothèques Python standard.
Vous pouvez utiliser pwd dans une cellule du notebook pour vérifier dans quel dossier il se trouve
pwd
'/home/marc/Documents/git/Python-3-Formation-complete/15-PDFs et tableaux de données'
import csv
Quand vous transmettez le chemn du fichier, n'oubliez pas son extension s'il en a une, d'ailleurs pour être sur de ne pas vous tromper, vous pouvez utiliser "tab" pour obtenir le nom du fichier automatiquement. Si l'autocompletion ne fonctionne pas avec la touche "tab" c'est un signe que vous n'êtes pas dans le bon dossier. Vou pouvez aussi donner l'adresse absolue du fichier, comme elle est affichée dans la sortie de pwd.
data = open('example.csv')
data
<_io.TextIOWrapper name='example.csv' mode='r' encoding='cp1252'>
Often csv files may contain characters that you can't interpret with standard python, this could be something like an @ symbol, or even foreign characters. Let's view an example of this sort of error (its pretty common, so its important to go over).
csv_data = csv.reader(data)
Cast to a list will give an error, note the can't decode line in the error, this is a giveaway that we have an encoding problem!
data_lines = list(csv_data)
--------------------------------------------------------------------------- UnicodeDecodeError Traceback (most recent call last) <ipython-input-6-1f501450909b> in <module> ----> 1 data_lines = list(csv_data) C:\ProgramData\Anaconda3\lib\encodings\cp1252.py in decode(self, input, final) 21 class IncrementalDecoder(codecs.IncrementalDecoder): 22 def decode(self, input, final=False): ---> 23 return codecs.charmap_decode(input,self.errors,decoding_table)[0] 24 25 class StreamWriter(Codec,codecs.StreamWriter): UnicodeDecodeError: 'charmap' codec can't decode byte 0x8d in position 1835: character maps to <undefined>
Let's not try reading it with a "utf-8" encoding.
data = open('example.csv',encoding="utf-8")
csv_data = csv.reader(data)
data_lines = list(csv_data)
# Looks like it worked!
data_lines[:3]
[['id', 'first_name', 'last_name', 'email', 'gender', 'ip_address', 'city'], ['1', 'Joseph', 'Zaniolini', 'jzaniolini0@simplemachines.org', 'Male', '163.168.68.132', 'Pedro Leopoldo'], ['2', 'Freida', 'Drillingcourt', 'fdrillingcourt1@umich.edu', 'Female', '97.212.102.79', 'Buri']]
Note the first item in the list is the header line, this contains the information about what each column represents. Let's format our printing just a bit:
for line in data_lines[:5]:
print(line)
['id', 'first_name', 'last_name', 'email', 'gender', 'ip_address', 'city'] ['1', 'Joseph', 'Zaniolini', 'jzaniolini0@simplemachines.org', 'Male', '163.168.68.132', 'Pedro Leopoldo'] ['2', 'Freida', 'Drillingcourt', 'fdrillingcourt1@umich.edu', 'Female', '97.212.102.79', 'Buri'] ['3', 'Nanni', 'Herity', 'nherity2@statcounter.com', 'Female', '145.151.178.98', 'Claver'] ['4', 'Orazio', 'Frayling', 'ofrayling3@economist.com', 'Male', '25.199.143.143', 'Kungur']
Let's imagine we wanted a list of all the emails. For demonstration, since there are 1000 items plus the header, we will only do a few rows.
len(data_lines)
1001
all_emails = []
for line in data_lines[1:15]:
all_emails.append(line[3])
print(all_emails)
['jzaniolini0@simplemachines.org', 'fdrillingcourt1@umich.edu', 'nherity2@statcounter.com', 'ofrayling3@economist.com', 'jmurrison4@cbslocal.com', 'lgamet5@list-manage.com', 'dhowatt6@amazon.com', 'kherion7@amazon.com', 'chedworth8@china.com.cn', 'hgasquoine9@google.ru', 'ftarra@shareasale.com', 'abathb@umn.edu', 'lchastangc@goo.gl', 'cceried@yale.edu']
What if we wanted a list of full names?
full_names = []
for line in data_lines[1:15]:
full_names.append(line[1]+' '+line[2])
full_names
['Joseph Zaniolini', 'Freida Drillingcourt', 'Nanni Herity', 'Orazio Frayling', 'Julianne Murrison', 'Lucy Gamet', 'Dyana Howatt', 'Kassey Herion', 'Chrissy Hedworth', 'Hyatt Gasquoine', 'Felicdad Tarr', 'Andrew Bath', 'Lucais Chastang', 'Car Cerie']
We can also write csv files, either new ones or add on to existing ones.
This will also overwrite any exisiting file with the same name, so be careful with this!
# newline controls how universal newlines works (it only applies to text
# mode). It can be None, '', '\n', '\r', and '\r\n'.
file_to_output = open('to_save_file.csv','w',newline='')
csv_writer = csv.writer(file_to_output,delimiter=',')
csv_writer.writerow(['a','b','c'])
7
csv_writer.writerows([['1','2','3'],['4','5','6']])
file_to_output.close()
f = open('to_save_file.csv','a',newline='')
csv_writer = csv.writer(f)
csv_writer.writerow(['new','new','new'])
13
f.close()
That is all for the basics! If you believe you will be working with CSV files often, you may want to check out the powerful pandas library.