windows 在python中阅读csv文件[重复]

von4xj4u  于 2022-11-26  发布在  Windows
关注(0)|答案(4)|浏览(227)

此问题在此处已有答案

Why can't I call read() twice on an open file?(7个答案)
Python : The second for loop is not running(1个答案)
Why can't I repeat the 'for' loop for csv.Reader?(2个答案)
For loop not working twice on the same file descriptor [duplicate](3个答案)
Iterating on a file doesn't work the second time [duplicate](4个答案)
四年前就关门了。
我想打开并读取文件Mappe1.csv,但它不工作。我使用Python 3.6.5 Anaconda。我不知道我做错了什么。有什么想法吗?
文件Mappe1.csv包含:

A;B;C
1;4;7
2;5;8
3;6;9

打开Mappe1.csv的python代码如下所示:

import csv

class CSVAdapter:
    def read_csv(self):
        with open("C:/Users/User/PycharmProjects/General/DesignUploader/Mappe1.csv") as file:
            dialect = csv.Sniffer().sniff(file.read(1024))
            csv_file = csv.reader(file.readlines(), dialect, quotechar='"')
            print("A")
            csv_file_list = []
            for row in file:
                print("B")
            for row in csv_file:
                print("C")
                csv_file_list.append(row)
        return csv_file_list

打印输出只有“A”。“B”和“C”没有打印出来,这使我得出结论,文件没有正确阅读。
是否需要任何python/windows设置来允许Python读取文件?
谢谢你的帮助!

carvr3hs

carvr3hs1#

你需要提供给csv.reader文件对象,而不是file.readlines()。如果你想打印B,你需要寻找到文件的开头,类似于C。

import csv

def read_csv():
    with open("data.csv") as file:
        dialect = csv.Sniffer().sniff(file.read(1024))
        csv_file = csv.reader(file, dialect, quotechar='"')

        print("A")
        csv_file_list = []

        file.seek(0)

        for row in file:
            print("B")

        file.seek(0)

        for row in csv_file:
            print("C")
            csv_file_list.append(row)
    return csv_file_list

print(read_csv())

印刷品:

A
B
B
B
B
C
C
C
C
[['A', 'B', 'C'], ['1', '4', '7'], ['2', '5', '8'], ['3', '6', '9']]
fykwrbwg

fykwrbwg2#

reader将文件对象作为第一个参数,而不是file.readlines()返回的列表。
所以你的台词:

csv_file = csv.reader(file.readlines(), dialect, quotechar='"')

应为:

csv_file = csv.reader(file, dialect, quotechar='"')

要打印的for循环('B ')应为:

for row in file.readlines():
    print('B')

您的for循环to print('C ')应该可以正常工作,尽管值得注意的是您可以直接设置csv_file_list = list(csv_file)。并且您应该使用以下命令将文件重置为第一行:

file.seek(0)
j1dl9f46

j1dl9f463#

在您的代码中,您只打印了ABC。请尝试打印整行。您将看到cvs_file中的row是一个对象,我们只访问了它的一部分。在the docs中,请参见以下示例:

>>> import csv
 >>> with open('eggs.csv', newline='') as csvfile:
 ...     spamreader = csv.reader(csvfile, delimiter=' ', quotechar='|')
 ...     for row in spamreader:
 ...         print(', '.join(row))
 Spam, Spam, Spam, Spam, Spam, Baked Beans
 Spam, Lovely Spam, Wonderful Spam

在此示例中,尝试:

for row in csv_file:
     print(','.join(row))

得双曲余切值.
最后,您需要更改读取文件的方式。您的cvs_files正在使用;delimiter。请尝试使用delimiter而不是dialect。并且您的file实际上没有任何属性row。您需要

lines = file.readlines()
slhcrj9b

slhcrj9b4#

这是一个替代的解决方案。我使用the Pandas tool来阅读CSV文件。代码实际上非常简单,并将答案输出到Pandas DataFrame数据结构中。对我来说,tt比csv工具更容易读取提取的信息,也更容易处理。
以下是代码片段:

import pandas

df = pandas.read_csv('C:/Users/User/PycharmProjects/General/DesignUploader/Mappe1.csv')
print (df)

相关问题