簡體   English   中英

如何在python中讀取csv文件的特定行?

[英]How to read a specific row of a csv file in python?

我瘋狂地搜索,試圖專門查找如何讀取csv文件中的行。

我需要讀取1000行中的隨機行,每個行都有3列。 第一列有一封電子郵件。 我需要放入隨機電子郵件,並取出第2列和第3列。 (Python 2.7,csv文件)

例:

Name Date  Color
Ray  May   Gray
Alex Apr   Green
Ann  Jun   Blue
Kev  Mar   Gold
Rob  May   Black

我需要[Ann],而不是第1列第3行。 這是CSV檔案,名稱超過1000個。 我必須輸入她的名字並輸出她的整行。


我嘗試過的

from collections import namedtuple
Entry = namedtuple('Entry', 'Name, Date, Color')
file_location = "C:/Users/abriman/Desktop/Book.csv"
ss_dict = {}
spreadsheet = file_location = "C:/Users/abriman/Desktop/Book.csv"
for row in spreadsheet:
    entry = Entry(*tuple(row))
    ss_dict['Ann']

我的錯誤讀

Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
TypeError: __new__() takes exactly 4 arguments (2 given)

我也嘗試了其他方法,但收效甚微。 我是python的初學者。

您走在正確的軌道上。 第一個問題:您永遠不會打開位於file_location的文件。 因此,當您迭代for row in spreadsheet: ,您將遍歷spreadsheet的字符,即file_location的字符,即"C:/Users/..."的字符。 因此,您要做的第一件事實際上是打開文件:

spreadsheet = open(file_location, 'r')

您的循環中還有另一個問題。 for循環中遍歷文件時,您會取回文件的各行。 因此,在每次迭代中, row是一行,例如"Ray May Gray" 當您在其上調用tuple()時,將得到一個看起來像('R', 'a', 'y', ' ', ' ', 'M', ...) 您需要做的是通過在空白處分割來構造元組:

entry = Entry(*row.split())

然后,您需要條目添加到字典ss_dict

ss_dict[entry.Name] = entry

最后,您可以讀出ss_dict['Ann'] ,但這應該在循環之外-如果在循環內執行,則可能ss_dict['Ann']讀取ss_dict['Ann']的值被設置。 總而言之,您的代碼應如下所示:

from collections import namedtuple
Entry = namedtuple('Entry', 'Name, Date, Color')
file_location = "C:/Users/abriman/Desktop/Book.csv"
ss_dict = {}
spreadsheet = open(file_location, 'r') # <--
for row in spreadsheet:
    entry = Entry(*row.split()) # <--
    ss_dict[entry.Name] = entry # <--
print ss_dict['Ann']

順便說一句,您收到錯誤消息的原因是,當您for row in spreadsheet:如我所提到的那樣, for row in spreadsheet: spreadsheet為字符串的情況下, row僅是一個字符 ,因此tuple(row)只是包含一個的元組字符,因此長度為1,因此在執行*tuple(row)時只傳遞一個參數,而不傳遞三個參數。


綜上所述,您可能需要考慮查看csv模塊 ,該模塊是標准庫的一部分,並且專門用於讀取csv文件。 從長遠來看,這可能會使您的生活更輕松。

我認為您需要枚舉

def read_csv_line(line_number, filename):
    with open("filename.csv") as fileobj
        for i, line in enumerate(fileobj):
            if i == (line_number - 1):
                return line
    return None

然后,您可以輸入您的隨機數和文件名以獲取隨機行。

解決問題的方法可能是簡單的字典理解:

>>> Entry = namedtuple('Entry', 'Name, Date, Color')
>>> [l for l in open('t.tsv', 'r')]
<<<
['Name Date  Color\n',
 'Ray  May   Gray\n',
 'Alex Apr   Green\n',
 'Ann  Jun   Blue\n',
 'Kev  Mar   Gold\n',
 'Rob  May   Black\n']
>>> [l.split() for l in open('t.tsv', 'r')]
<<<
[['Name', 'Date', 'Color'],
 ['Ray', 'May', 'Gray'],
 ['Alex', 'Apr', 'Green'],
 ['Ann', 'Jun', 'Blue'],
 ['Kev', 'Mar', 'Gold'],
 ['Rob', 'May', 'Black']]
>>> [Entry(*l.split()) for l in open('t.tsv', 'r')]
<<<
[Entry(Name='Name', Date='Date', Color='Color'),
 Entry(Name='Ray', Date='May', Color='Gray'),
 Entry(Name='Alex', Date='Apr', Color='Green'),
 Entry(Name='Ann', Date='Jun', Color='Blue'),
 Entry(Name='Kev', Date='Mar', Color='Gold'),
 Entry(Name='Rob', Date='May', Color='Black')]    >>> {'fooo':e for e in Entry(*l.split()) for l in open('t.tsv', 'r')}
>>> {e.Name:e for e in list(Entry(*l.split()) for l in open('t.tsv', 'r'))}
<<<
{'Alex': Entry(Name='Alex', Date='Apr', Color='Green'),
 'Ann': Entry(Name='Ann', Date='Jun', Color='Blue'),
 'Kev': Entry(Name='Kev', Date='Mar', Color='Gold'),
 'Name': Entry(Name='Name', Date='Date', Color='Color'),
 'Ray': Entry(Name='Ray', Date='May', Color='Gray'),
 'Rob': Entry(Name='Rob', Date='May', Color='Black')}

我認為您正在考慮將第一行作為標題名稱閱讀。 Python具有DictReader- https: //docs.python.org/2/library/csv.html#csv.DictReader

>>> import csv
>>> for line in csv.DictReader(open('t.tsv')): print line # don't forget to make your file coma-separated. 
{'Date': 'May', 'Color': 'Gray', 'Name': 'Ray'}
{'Date': 'Apr', 'Color': 'Green', 'Name': 'Alex'}
{'Date': 'Jun', 'Color': 'Blue', 'Name': 'Ann'}
{'Date': 'Mar', 'Color': 'Gold', 'Name': 'Kev'}
{'Date': 'May', 'Color': 'Black', 'Name': 'Rob'}

或具有字典理解能力:

>>> { line['Name']: line for line in csv.DictReader(open('t.tsv')) }
<<<
{'Alex': {'Color': 'Green', 'Date': 'Apr', 'Name': 'Alex'},
 'Ann': {'Color': 'Blue', 'Date': 'Jun', 'Name': 'Ann'},
 'Kev': {'Color': 'Gold', 'Date': 'Mar', 'Name': 'Kev'},
 'Ray': {'Color': 'Gray', 'Date': 'May', 'Name': 'Ray'},
 'Rob': {'Color': 'Black', 'Date': 'May', 'Name': 'Rob'}}
>>> rows_by_name = { line['Name']: line for line in csv.DictReader(open('t.tsv')) }
>>> rows_by_name['Ann']
<<< {'Color': 'Blue', 'Date': 'Jun', 'Name': 'Ann'}

如果您想要隨機樣本-我建議您首先將一行讀入列表,然后通過randbom模塊進行選擇。 或者...讓我們用Entry來做:

>>> rows = list(Entry(*l.split()) for l in open('t.tsv', 'r'))
>>> import random
>>> random.sample(rows, 1)
<<< [Entry(Name='Ray', Date='May', Color='Gray')]
>>> random.sample(rows, 1)
<<< [Entry(Name='Alex', Date='Apr', Color='Green')]
>>> random.sample(rows, 1)
<<< [Entry(Name='Name', Date='Date', Color='Color')]
>>> random.sample(rows, 1)
<<< [Entry(Name='Alex', Date='Apr', Color='Green')]
>>> random.sample(rows, 1)
<<< [Entry(Name='Alex', Date='Apr', Color='Green')]
>>> random.sample(rows, 1)
<<< [Entry(Name='Alex', Date='Apr', Color='Green')]
>>> random.sample(rows, 3)
<<<
[Entry(Name='Ray', Date='May', Color='Gray'),
 Entry(Name='Kev', Date='Mar', Color='Gold'),
 Entry(Name='Ann', Date='Jun', Color='Blue')]
>>> random.sample(rows, 3)
<<<
[Entry(Name='Ann', Date='Jun', Color='Blue'),
 Entry(Name='Rob', Date='May', Color='Black'),
 Entry(Name='Name', Date='Date', Color='Color')]
>>> random.sample(rows, 3)
<<<
[Entry(Name='Rob', Date='May', Color='Black'),
 Entry(Name='Ann', Date='Jun', Color='Blue'),
 Entry(Name='Kev', Date='Mar', Color='Gold')]

但請注意,您可能會過多地加載內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM