【问题标题】:Reading a csv file in python [duplicate]在python中读取csv文件[重复]
【发布时间】:2018-07-24 22:13:53
【问题描述】:

我想打开并读取文件 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 读取文件?

感谢您的帮助!

【问题讨论】:

  • read(1024) 的调用会读取整个文件,没有留下可读取的内容。然后你打电话给readlines(),它也会读取整个文件,或者如果还有任何东西的话。然后for row in file: 也会读取整个文件。当然,for row in csv_file: 也是如此。

标签: python windows file csv


【解决方案1】:

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

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']]

【讨论】:

    【解决方案2】:

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

    所以你的台词:

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

    应该是:

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

    你的 for 循环 print('B') 应该是:

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

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

    file.seek(0)
    

    【讨论】:

      【解决方案3】:

      我在处理数据时使用pandas 来读取 csvs。代码非常简单,将答案输出到 pandas DataFrame

      import pandas

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

      df

      【讨论】:

        【解决方案4】:

        在您的代码中,您只打印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;。试试这个,而不是dialect。而您的file 实际上并没有任何属性row。你需要

        lines = file.readlines()
        

        【讨论】:

          猜你喜欢
          • 2013-01-21
          • 1970-01-01
          • 2013-04-06
          • 1970-01-01
          • 2016-02-22
          • 2015-07-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多