1
votes

Lire le fichier CSV de stdin en Python et le modifier

J'ai besoin de lire le fichier csv depuis stdin et de sortir les lignes uniquement les lignes dont les valeurs sont égales à celles spécifiées dans les colonnes. Mon entrée est comme ceci:

 ['2']
 ['Kashiwa']
 ['Name', 'Campus', 'LabName']
 ['Shinichi MORISHITA', 'Kashiwa', 'Laboratory of Omics']
 ['Kenta Naai', 'Shirogane', 'Laboratory of Functional Analysis in 
 Silico']
 ['Kiyoshi ASAI', 'Kashiwa', 'Laboratory of Genome Informatics']
 ['Yukihide Tomari', 'Yayoi', 'Laboratory of RNA Function']

Ma sortie devrait être comme ceci:

 #!usr/bin/env python3

 import sys
 import csv

 data = sys.stdin.readlines()

 for line in csv.reader(data):

      print(line)

J'ai besoin de trier les personnes dont les valeurs dans la colonne # 2 == Kashiwa et ne pas afficher les 2 premières lignes de stdin dans stdout.

Jusqu'à présent, j'ai juste essayé de lire de stdin dans csv mais j'obtiens chaque ligne sous forme de liste de chaînes (comme prévu dans la documentation csv). Puis-je changer cela?

 Name,Campus,LabName
 Shinichi MORISHITA,Kashiwa,Laboratory of Omics
 Kiyoshi ASAI,Kashiwa,Laboratory of Genome Informatics

Résultat:

 2
 Kashiwa
 Name,Campus,LabName
 Shinichi MORISHITA,Kashiwa,Laboratory of Omics
 Kenta Naai,Shirogane,Laboratory of Functional Analysis in Silico
 Kiyoshi ASAI,Kashiwa,Laboratory of Genome Informatics
 Yukihide Tomari,Yayoi,Laboratory of RNA Function

Quelqu'un peut-il me donner des conseils sur la lecture de stdin en CSV et la manipulation les données plus tard (afficher uniquement les valeurs nécessaires des colonnes, permuter les colonnes, etc.,)?


1 commentaires

peut-être DataFrame.to_csv ?


3 Réponses :


0
votes
 #!usr/bin/env python3
 import sys
 import csv

 data = sys.stdin.readlines()  # to read the file
 column_to_be_matched = int(data.pop(0)) # to get the column number to match
 word_to_be_matched = data.pop(0) # to get the word to be matched in said column
 col_headers = data.pop(0) # to get the column names
 print(", ".join(col_headers)) # to print the column names
 for line in csv.reader(data):
     if line[column_to_be_matched-1] == word_to_be_matched: #while it matched
        print(", ".join(line)) #print it

0 commentaires

1
votes

Voici une approche.

Ex:

['Name', 'Campus', 'LabName']
['Shinichi MORISHITA', 'Kashiwa', 'Laboratory of Omics']
['Kiyoshi ASAI', 'Kashiwa', 'Laboratory of Genome Informatics']

Sortie:

import csv

with open(filename) as csv_file:
    reader = csv.reader(csv_file)
    next(reader) #Skip First Line
    next(reader) #Skip Second Line
    print(next(reader)) #print Header
    for row in reader:
        if row[1] == 'Kashiwa':   #Filter By 'Kashiwa'
            print(row)


7 commentaires

Existe-t-il un moyen de changer le type de données de sortie et de changer la liste de chaînes en chaînes séparées par des virgules? Cela devrait ressembler à ceci: Nom, Campus, LabName Shinichi MORISHITA, Kashiwa, Laboratoire d'Omique Kiyoshi ASAI, Kashiwa, Laboratoire d'Informatique du Génome


Mon entrée ne provient pas du fichier mais plutôt des lignes de stdin, donc le lecteur ne fonctionne pas pour cela


Mais vous avez csv.reader (data): dans votre code ... cela ne fonctionne pas? Remarque: Vous n'êtes pas obligé d'utiliser avec open (filename) comme csv_file: Je viens de l'ajouter en tant que code de démonstration


Cependant, lorsque je l'utilise maintenant avec next (), cela me montre une erreur: next (reader) StopIteration


Merci beaucoup pour votre aide. Dernière question. Comment supprimer également les espaces blancs entre les chaînes consécutives dans la sortie? Pour que ce ne soit pas Nom, Campus, LabName mais Nom, Campus, LabName


Désolé une fois de plus. Le évaluateur me montre l'erreur avec cette note: "De plus, les caractères spéciaux tels que", "ou" "" et le saut de ligne ne sont pas inclus dans le nom, etc. Vous pouvez le considérer comme un fichier CSV ordinaire. "Comment supprimer ces caractères dans mon csv?


continuons cette discussion dans le chat .



1
votes

Utilisez Pandas pour lire et gérer vos données dans un DataFrame

df.sort(columns='your column')

Vous pouvez effectuer toutes sortes de modifications, par exemple trier votre DataFrame simplement par:

import pandas as pd
# File location
infile = r'path/file'
# Load file and skip first two rows
df = pd.read_csv(infile, skiprows=2)
# Refresh your Dataframe en throw out the rows that contain Kashiwa in the campus column
df = df[df['campus'] != 'Kashiwa']


1 commentaires

Merci beaucoup. Encore une question. Le évaluateur me montre l'erreur avec cette note: "De plus, les caractères spéciaux tels que", "ou" "" et le saut de ligne ne sont pas inclus dans le nom, etc. Vous pouvez le considérer comme un fichier CSV ordinaire. "Comment supprimer ces caractères dans mon csv?