从列值中获取行中的值

Getting a value in a row from a column value

我有一个如下所示的 csv 文件:

----------------------------------------------------------
|Student ID |   Name   | Username | Password | Moderator |
----------------------------------------------------------    
|   0001    | Foo Bar  |   test   |   abc123  |     N    |
|   0002    |  Baz Qux |   bob    |   bcd986  |     Y    |
----------------------------------------------------------

我如何从列值中获取行中的值?

例如,如果我有用户名 'test',我如何在相应的行 (Foo Bar) 中获取 'Name' 的值?

正在使用 pandas

读取 csv 文件
import pandas as pd
# Here you can use pd.read_csv() instead
df = pd.read_clipboard(sep=',')

从列值访问一行中的值

df[df.Username == 'test']['Name']

[出]:

0    Foo Bar
Name: Name, dtype: object

如果您需要字符串形式的结果:

df[df.Username == 'test'].Name.values[0]

[出]:

'Foo Bar'

格式不是真正的 csv。您可以将其重写为有用的内容并使用 DictReader 进行解析:

import csv

def rewriteCsv(filename): 
    """Rewrite silly file into something usefull"""
    header = None
    rwfn = "mod_"+filename
    with open (filename,"r") as r, open(rwfn,"w") as w:
        for row in r:
            if row.startswith("---"):
                continue # skip it
            if not header:
                header = ','.join(x.strip() for x in row.split("|") if x.strip())
                w.write(header+'\n')
                continue

            w.write(','.join( x.strip() for x in row.strip()[1:-1].split("|") ) +"\n")
    return rwfn

def createFile(filename):
    """Create the silly file..."""
    with open(filename,"w") as f:
        f.write("""----------------------------------------------------------
|Student ID |   Name   | Username | Password | Moderator |
----------------------------------------------------------    
|   0001    | Foo Bar  |   test   |   abc123  |     N    |
|   0002    |  Baz Qux |   bob    |   bcd986  |     Y    |
----------------------------------------------------------
""")

createFile("file.txt") # create the silly one
fn = rewriteCsv("file.txt") # rewrite into something useful

with open(fn,"r") as r: 
    reader = csv.DictReader(r)
    for row in reader: # access earch ordered dict by columnname
        print(row["Student ID"], row["Name"], row["Username"])

有几个选项可以完成您的任务。 First,正如@michaelg 建议的那样,使用 pandas - 它速度很快,库处理得很好。这是 pandas. Second option would be a build in csv module 的 link。在那里您可以找到带有分隔符的 scv reader 的简短示例。第三个选项是将您的 .scv 文件视为普通文件。例如,

with open("test.csv", "r") as f:
    data = f.readlines()
    # we skip first line because it is your header,
    # e.g. id, name, pswd, etc.
    for line in data[1:]:
        for field in line.split("|"): # place your delimiter
            # strip data of leading and trailing whitespaces 
            print(field.strip()) 

您可以使用此方法搜索您对应的值。上面的代码片段会产生这个输出:

0001
Foo Bar
test
abc123
N

如果您想通过索引访问值,请使用:

with open("test.csv", "r") as f:
    data = f.readlines()
    values = [x.split("|") for x in data[1:]]

上面的代码片段会给你一个 list 这种格式 [[..], [..],..] 其中 values[0] 是你的文件的第 1 行并且 values[0][1] = "Foo Bar"名字.