Python 我编写了一个自定义函数,用于从csv文件中获取数据,该函数在代码中只能工作一次

Python 我编写了一个自定义函数,用于从csv文件中获取数据,该函数在代码中只能工作一次,python,csv,Python,Csv,我有一个csv文件,有2列11行,只有一个标题行和10个数字行 我使用自定义函数使用csv库从csv文件中获取数据。csv文件根据用户的选择输出列1或列2作为列表。输入参数为: name\u string:它是用户想要的列的名称 数据文件:使用csv库打开的csv文件 功能是: def fetch(name_string, data_file): x = 0 location = 0 output = [] if name_string == "ONE":

我有一个csv文件,有2列11行,只有一个标题行和10个数字行

我使用自定义函数使用csv库从csv文件中获取数据。csv文件根据用户的选择输出列1或列2作为列表。输入参数为:

name\u string:它是用户想要的列的名称 数据文件:使用csv库打开的csv文件 功能是:

def fetch(name_string, data_file):
    x = 0
    location = 0
    output = []

    if name_string == "ONE":
        location = 0
    elif name_string == "TWO":
        location = 1
    else:
        return print("An unknown error occurred")

    for line in data_file:                          
        if x > 0:
            output.append(float(line[location]))              
        x += 1

    return output
在代码中使用该函数时,该函数可以正常工作,但只能工作一次。第二次返回空列表[]。我还是不明白为什么会这样

代码是:

import csv

def fetch(name_string, data_file):
    x = 0
    location = 0
    output = []

    if name_string == "ONE":
        location = 0
    elif name_string == "TWO":
        location = 1
    else:
        return print("An unknown error occurred")

    for line in data_file:                          
        if x > 0:
            output.append(float(line[location]))              
        x += 1

    return output


with open('test_file.csv', 'r') as data1:

    rawData = csv.reader(data1)

    Col1 = fetch("ONE", rawData)
    Col2 = fetch("TWO", rawData)

    print(Col1)
    print(Col2)
Col1输出很好,但Col2输出为[]


所以,我没有尝试过这个…但是,我相信库的工作方式是像文件流一样打开

因此,在第一次迭代中,您一直在读取文件的EOF结尾,我猜这就是为什么在第二次调用fetch时,filestream对象没有返回任何内容,因为它已经读取了整个文件并输出[]

轻松解决代码问题的一种方法是打开fetch函数内部的文件……尽管这根本没有效率

另一种方法是将文件存储在内存中,存储在您认为合适的dict、list等结构中,然后基于该对象执行数据打印


希望这个猜测能有所帮助…

所以,我还没有尝试过这个…但是,我相信库的工作方式是像文件流一样打开

因此,在第一次迭代中,您一直在读取文件的EOF结尾,我猜这就是为什么在第二次调用fetch时,filestream对象没有返回任何内容,因为它已经读取了整个文件并输出[]

轻松解决代码问题的一种方法是打开fetch函数内部的文件……尽管这根本没有效率

另一种方法是将文件存储在内存中,存储在您认为合适的dict、list等结构中,然后基于该对象执行数据打印


希望这一猜测能有所帮助……

我认为这是因为您在第一次调用函数时只遍历了csv.reader对象一次。当你再次调用这个函数时,没有什么可读的,因为你已经在CSV的末尾了


一个简单的解决方法是将csv文件名传递给函数,并在函数内部打开和读取文件

我认为这是因为您在第一次调用函数时遍历了csv.reader对象一次。当你再次调用这个函数时,没有什么可读的,因为你已经在CSV的末尾了

一个简单的解决方法是将csv文件名传递给函数,并在函数内部打开和读取文件

返回一个迭代器,然后

您可能希望将csv内容转换为列表,或者重新编写函数以同时处理两列。

返回迭代器,然后


您可能希望将csv内容转换为列表,或者重新编写函数以同时处理两列。

您应该将csv读入内存,然后执行所需操作

顺便说一下,提问前请先搜索


你一定要把csv读入内存,然后做任何你需要的事情

顺便说一下,提问前请先搜索


如果你只做col2,会发生什么?如果在第二次调用fetch时使用参数ONE,会发生什么?。因此,作为迭代器,它只能被遍历一次。因此,您可能希望传递fetch文件名并让它读取文件。同样,该函数只在第一次获取数据。它第二次返回一个空白列表。您正在使用已读取的数据,即rawData。您跳过文档第一行的方式有点脏。也许考虑在枚举的ATAAX文件中使用N行,如果n>0:输出。追加……如果只做COL2,会发生什么?如果在第二次调用fetch时使用参数ONE,会发生什么?。因此,作为迭代器,它只能被遍历一次。因此,您可能希望传递fetch文件名并让它读取文件。同样,该函数只在第一次获取数据。它第二次返回一个空白列表。您正在使用已读取的数据,即rawData。您跳过文档第一行的方式有点脏。也许考虑在枚举的ATAAX文件中使用N行,如果N> 0:输出。
import csv

def fetch(name_string, data):
    x = 0
    location = 0
    output = []

    if name_string == "ONE":
        location = 0
    elif name_string == "TWO":
        location = 1
    else:
        return print("An unknown error occurred")

    for line in data:
        if x > 0:
            output.append(float(line[location]))              
        x += 1

    return output


with open("test_file.csv", "r") as f:
    reader = csv.reader(f)
    data = list(reader)

col1 = fetch("ONE", data)
col2 = fetch("TWO", data)

print(col1)
print(col2)