如何在不使用外部库(如Numpy,Pandas)的情况下读取CSV文件?

8ehkhllq  于 2023-04-18  发布在  其他
关注(0)|答案(5)|浏览(158)

这是面试中经常出现的问题。
我知道如何使用Pandas读取csv文件。
然而,我正在努力寻找一种不使用外部库读取文件的方法。
Python是否附带了任何有助于读取csv文件的模块?

w41d8nur

w41d8nur1#

你很可能需要一个库来读取CSV文件。虽然你可以自己打开和解析数据,但这将是繁琐和耗时的。幸运的是,python附带了一个标准的csv模块,你不必pip安装!你可以像这样读取你的文件:

import csv

with open('file.csv', 'r') as file:
    my_reader = csv.reader(file, delimiter=',')
    for row in my_reader:
        print(row)

这将向您显示每个row都是作为列表读入的。然后您可以基于索引来处理它!还有其他方法可以读入数据,如https://docs.python.org/3/library/csv.html所述,其中一种方法将创建字典而不是列表!

更新

你链接了你的github为项目我采取了剪

product_id,product_name,aisle_id,department_id
9327,Garlic Powder,104,13
17461,Air Chilled Organic Boneless Skinless Chicken Breasts,35,12
17668,Unsweetened Chocolate Almond Breeze Almond Milk,91,16
28985,Michigan Organic Kale,83,4
32665,Organic Ezekiel 49 Bread Cinnamon Raisin,112,3
33120,Organic Egg Whites,86,16
45918,Coconut Butter,19,13
46667,Organic Ginger Root,83,4
46842,Plain Pre-Sliced Bagels,93,3

将其保存为file.csv,并使用上面的代码运行。结果:

['product_id', 'product_name', 'aisle_id', 'department_id']
['9327', 'Garlic Powder', '104', '13']
['17461', 'Air Chilled Organic Boneless Skinless Chicken Breasts', '35', '12']
['17668', 'Unsweetened Chocolate Almond Breeze Almond Milk', '91', '16']
['28985', 'Michigan Organic Kale', '83', '4']
['32665', 'Organic Ezekiel 49 Bread Cinnamon Raisin', '112', '3']
['33120', 'Organic Egg Whites', '86', '16']
['45918', 'Coconut Butter', '19', '13']
['46667', 'Organic Ginger Root', '83', '4']
['46842', 'Plain Pre-Sliced Bagels', '93', '3']

这就是你在你的问题中所问的。我不打算为你做你的项目,你应该能够从这里工作。

kgqe7b3p

kgqe7b3p2#

最近我得到了一个非常相似的问题,比这个问题更复杂,关于在不使用pandas的情况下制作数据结构。这是我迄今为止发现的唯一相关问题。如果我接受这个问题,那么我被问到的是:把产品id作为键放到字典中,然后把通道和部门id的元组列表作为值(在python中)。字典是必需的 Dataframe 。当然,我不能在15分钟内完成(而不是在2小时内)。我很难想到numpy和pandas之外的东西。
我有以下解决方案,这也回答了这个问题在开始。可能不理想,但得到了我所需要的。
希望这也有帮助。

import csv
file =  open('data.csv', 'r')
reader = csv.reader(file)

items = []  # put the rows in csv to a list
aisle_dept_id = []  # to have a tuple of aisle and dept ids
mydict = {} # porudtc id as keys and list of above tuple as values in a dictionary

product_id, aisle_id, department_id, product_name = [], [], [], []

for row in reader:
    items.append(row)

for i  in range(1, len(items)):
    product_id.append(items[i][0])
    aisle_id.append(items[i][1])
    department_id.append(items[i][2])
    product_name.append(items[i][3])

for item1, item2 in zip(aisle_id, department_id):
    aisle_dept_id.append((item1, item2))
for item1, item2 in zip(product_id, aisle_dept_id):
    mydict.update({item1: [item2]})

有了输出,

mydict:
{'9327': [('104', '13')],
 '17461': [('35', '12')],
 '17668': [('91', '16')],
 '28985': [('83', '4')],
 '32665': [('112', '3')],
 '33120': [('86', '16')],
 '45918': [('19', '13')],
 '46667': [('83', '4')],
 '46842': [('93', '3')]}
zsohkypk

zsohkypk3#

当一个人的生产环境受到内存限制时,能够读取和管理数据而不导入其他库可能会有所帮助。
为了实现这一点,内置的csv模块完成了这项工作。

import csv

至少有两种方法可以做到这一点:使用csv.Reader()或使用csv.DictReader()
csv.Reader()允许您使用索引访问CSV数据,非常适合简单的CSV文件(Source)。
另一方面,csv.DictReader()更友好且易于使用,特别是在处理大型CSV文件(Source)时。
以下是如何使用csv.Reader()执行此操作

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

以下是如何使用csv.DictReader()执行此操作

>>> import csv
>>> with open('names.csv', newline='') as csvfile:
...     reader = csv.DictReader(csvfile)
...     for row in reader:
...         print(row['first_name'], row['last_name'])
...
Eric Idle
John Cleese

>>> print(row)
{'first_name': 'John', 'last_name': 'Cleese'}

例如,check Real Python's page here

1l5u6lss

1l5u6lss4#

有类似的需求,想出了这个解决方案;一个将csv转换为json的函数(需要json以提高可读性,并使查询数据更容易,而无需访问Pandas)。如果函数的headers argumement是True,则csv的第一行用作json中的键,否则使用值索引作为键。

from csv import reader as csv_reader

def csv_to_json(csv_path: str, headers: bool) -> list:
  '''Convert data from a csv to json'''
  # store json data
  json_data = []
  
  try:
    with open(csv_path, 'r') as file:
      reader = csv_reader(file)
      # set column names using first row
      if headers:
        columns = next(reader)
      
      # convert csv to json
      for row in reader:
        row_data = {}
        for i in range(len(row)):
          # set key names
          if headers:
            row_key = columns[i].lower()
          else: 
            row_key = i
          # set key/value
          row_data[row_key] = row[i]
        # add data to json store 
        json_data.append(row_data)
        
  # error handling
  except Exception as e:
    print(repr(e))
    
  return json_data

给定一个包含以下内容的csv

+------+-------+------+
| Year | Month | Week |
+------+-------+------+
| 2020 |    11 |   11 |
| 2020 |    12 |   12 |
+------+-------+------+

带有标题的输出为

[
  {"year": 2020, "month": 11, "week": 11},
  {"year": 2020, "month": 12, "week": 12}
]

不带标题的输出为

[
  {"0": 2020, "1": 11, "2": 11},
  {"0": 2020, "1": 12, "2": 12}
]
flvlnr44

flvlnr445#

以下解决方案的灵感来自this answer。下面示例中的输出内容是使用以下输入数据生成的:

data.csv

Id,name,age,height,weight
1,Alice,20,62,120.6
2,Freddie,21,74,190.6
3,Bob,17,68,120.0

如果你想在下面的例子中漂亮地打印输出,你可以使用以下方法:

import json
print(json.dumps(data, indent=4, sort_keys=True, default=str))

方案一-使用csv.reader()获取list对象列表

import csv

def read_csv(filepath: str):
    data = []
    with open(filepath, 'r') as f:
        reader = csv.reader(f, delimiter=',')
        for row in reader:             
            data.append(row)  
        
    return data
        
        
data = read_csv('data.csv')
print(data)

输出

[['Id', 'name', 'age', 'height', 'weight'], ['1', 'Alice', '20', '62', '120.6'],
 ['2', 'Freddie', '21', '74', '190.6'], ['3', 'Bob', '17', '68', '120.0']]

要逐行打印数据,您也可以使用以下命令:

print('\n'.join(', '.join(map(str,row)) for row in data))

输出:

Id, name, age, height, weight
1, Alice, 20, 62, 120.6
2, Freddie, 21, 74, 190.6
3, Bob, 17, 68, 120.0

方案2 -使用csv.DictReader()获取dict对象列表

import codecs
import csv

def read_csv(filepath):
    with open(filepath, 'rb') as f:
        reader = csv.DictReader(codecs.iterdecode(f, 'utf-8'))
        data = list(reader)
        
    return data
        
        
data = read_csv('data.csv')
print(data)

输出

[{'Id': '1', 'name': 'Alice', 'age': '20', 'height': '62', 'weight': '120.6'}, 
 {'Id': '2', 'name': 'Freddie', 'age': '21', 'height': '74', 'weight': '190.6'}, 
 {'Id': '3', 'name': 'Bob', 'age': '17', 'height': '68', 'weight': '120.0'}]

方案3 -使用csv.DictReader()根据主键获取dict对象的字典

import codecs
import csv

def read_csv(filepath):
    data = {}
    with open(filepath, 'rb') as f:
        reader = csv.DictReader(codecs.iterdecode(f, 'utf-8'))
        for row in reader:             
            key = row['Id']  # Assuming a column named 'Id' to be the primary key
            data[key] = row  
        
    return data
        
        
data = read_csv('data.csv')
print(data)

输出

{'1': {'Id': '1', 'name': 'Alice', 'age': '20', 'height': '62', 'weight': '120.6'}, 
 '2': {'Id': '2', 'name': 'Freddie', 'age': '21', 'height': '74', 'weight': '190.6'}, 
 '3': {'Id': '3', 'name': 'Bob', 'age': '17', 'height': '68', 'weight': '120.0'}}

漂亮的打印输出(使用本答案顶部提到的代码):

{
    "1": {
        "Id": "1",
        "age": "20",
        "height": "62",
        "name": "Alice",
        "weight": "120.6"
    },
    "2": {
        "Id": "2",
        "age": "21",
        "height": "74",
        "name": "Freddie",
        "weight": "190.6"
    },
    "3": {
        "Id": "3",
        "age": "17",
        "height": "68",
        "name": "Bob",
        "weight": "120.0"
    }
}

相关问题