2017-03-07 1 views
1

Ma question est probablement assez simple, mais je n'ai pas encore réussi à l'obtenir.Comment: supprimer des lignes et des colonnes de manière sélective dans un fichier CSV à partir de Python

Je travaille sur un programme qui compare les fichiers csv pour une certaine application physique, mais ce n'est pas le problème. Les fichiers que j'ai besoin de comparer ont deux colonnes avec plusieurs milliers de valeurs de ligne pour ces deux colonnes, cependant, il y a aussi des lignes et des colonnes superflues au-dessus de ce point qui causent le problème. Tout d'abord, voici le fichier CSV et vous pouvez évidemment voir les lignes supplémentaires et les valeurs de colonne que j'ai besoin de remplacer. Pratiquement parlant, il suffit de retirer les 24 premières rangées.

Une fois cela fait, je voudrais déplacer toutes les valeurs jusqu'à ce que la ligne 25 devienne la ligne 1, tout en déplaçant également toutes les lignes suivantes.

La seule raison pour laquelle je vais à ce problème est que je puisse utiliser le code suivant pour dépouiller les données CSV et faire des calculs complexes sur elle:

import csv 
with open('Unknown69-Spectra-Bloom_.csv') as csvfile: 
    reader = csv.DictReader(csvfile) 
    for row in reader: 
     print(row['Energy'], row['Counts']) 

Je serais vraiment reconnaissant de votre aide. Plus la solution est simple, mieux c'est. Mon objectif est de prendre les deux colonnes, l'énergie et les comptes, puis d'exécuter leurs valeurs dans mon programme complet.

Merci, David

+1

Je converti votre image de code à code réel et édité dans votre réponse. Ne postez pas d'images de code. C'est le moyen le plus rapide d'empêcher les gens de répondre à vos questions ici. –

Répondre

3

Vous pouvez utiliser pandas géants, ce qui rend ce genre de chose très simple:

import pandas 
df = pandas.read_csv('file.csv', skiprows=24, header=None, names=[ 
    'Energy', 'Counts']) 
print(df2['Energy']) 
print(df2['Counts']) 

Vous pouvez accéder à ces tableaux de la trame de données de diverses manières, la plus facile étant Ensuite, vous avoir un dataframe pandas, qui est une collection de tableaux numpy.

Vous pouvez également utiliser numpy:

import numpy as np 
df = np.genfromtxt('file.csv', skip_header=24, delimiter=',') 

Ce qui vous donnera également une collection de tableaux numpy. Si vous ignorez les lignes lors de la lecture, vous n'avez pas besoin de réinitialiser l'index.
Il est possible de le faire en utilisant csv, mais pandas et numpy sont très utiles, donc si vous êtes prêt à les essayer, ils peuvent être excellents au traitement des données.

Docs:

pandas géants: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.read_csv.html

numpy: https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html

+0

Ok merci! Je suis assez nouveau pour python, donc je n'avais jamais entendu parler de pandas ou de numpy auparavant. Merci. –

0

Donc, vous voulez que les deux premières colonnes et des lignes après 24?

import csv 

in_file = open("whatever.csv", "r") 
out_file = open("whatever_transformed.csv", "w", newline="") 

in_csv = csv.reader(in_file) 
out_csv = csv.writer(out_file) 

for row_number, row in enumerate(in_csv): 
    if row_number >= 24: 
     out_csv.writerow(row[:2]) 

in_file.close() 
out_file.close() 
+0

D'accord, je veux que toutes les lignes soient attachées aux deux colonnes après la rangée 24, mais je peux faire cette partie moi-même. Laissez-moi essayer cela et voir comment cela fonctionne! –

+0

Je suis probablement stupide mais je ne suis pas sûr de savoir ce que signifie une "ligne attachée à une colonne". Pouvez-vous décrire la forme des données un peu plus précisément? – Denziloe

+0

Donc, votre idée me donne ce code d'erreur dont je ne sais pas comment contourner. PermissionError: [Errno 13] Permission denied: 'Unknown69-Spectra-Bloom_.csv' –

1

simple serait de sauter les lignes indésirables avant de créer votre DictReader:

with open('Unknown69-Spectra-Bloom_.csv', newline='') as csvfile: 
    nskiplines = 24 
    for _ in range(nskiplines): 
     next(csvfile) 
    reader = csv.DictReader(csvfile)