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.,)?
3 Réponses :
#!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
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)
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 .
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']
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?
peut-être DataFrame.to_csv ?