将CSV解析为列表或数组的更好方法

时间:2017-12-21 08:14:20

标签: python python-3.x csv numpy

是否有更好的方法从此csv file创建列表或numpy数组?我要问的是如何做到这一点,并且比我在下面的代码中更优雅地解析。

fname = open("Computers discovered recently by discovery method.csv").readlines()
lst = [elt.strip().split(",")[8:] for elt in fname if elt != "\n"][4:]

lst2 = []
for row in lst:
    print(row)
    if row[0].startswith("SMZ-") or row[0].startswith("MTR-"):
        lst2.append(row)

print(*lst2, sep = "\n")

5 个答案:

答案 0 :(得分:2)

您始终可以使用Pandas。例如,

import pandas as pd
import numpy as np

df = pd.read_csv('pandas_dataframe_importing_csv/example.csv')

要进行转换,您必须将其转换为您喜欢的数字类型。我想你可以把整个事情写成一行:

result = numpy.array(list(df)).astype("float")

您还可以执行以下操作:

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')

答案 1 :(得分:1)

我不确定你想要什么,但试试这个

import csv
with open("Computers discovered recently by discovery method.csv", 'r') as f:
    reader = csv.reader(f)
    ll = list(reader)

print (ll)

这应该逐行读取csv并将其存储为列表

答案 2 :(得分:1)

您可以使用pandas并指定标题列,使其在您的示例文件上正常工作

import pandas as pd

df = pd.read_csv('Computers discovered recently by discovery method.csv', header=2)

您可以使用以下方式检查您的内容:

>>> df.head()

您可以使用

检查标题
>>> df.columns 

要将其转换为numpy数组,您可以使用

>>> np_arr = df.values

它提供了许多解析和读取csv文件的选项。有关详细信息,请查看docs

答案 3 :(得分:0)

示例代码

import csv
csv_file = 'sample.csv'
with open(csv_file) as fh:
  reader = csv.reader(fh)
  for row in reader:
    print(row)

<强> sample.csv

name,age,salary
clado,20,25000
student,30,34000
sam,34,32000

答案 4 :(得分:0)

除非您想要处理所有可能的异常和CSV格式奇怪,否则不应手动解析CSV结构。 Python在这方面涵盖了csv模块。

在您的情况下,主要问题源于您的数据 - 单个文件中似乎有两种不同的CSV结构,因此您首先需要找到第二个结构的起始位置。另外,从您的代码中,您似乎希望在Details_Table0_Netbios_Name0之前过滤掉所有列,并且仅包含Details_Table0_Netbios_Name0SMZ-MTR-开头的行。如下所示:

import csv

with open("Computers discovered recently by discovery method.csv") as f: 
    reader = csv.reader(f)  # create a CSV reader
    for row in reader:  # skip the lines until we encounter the second CSV structure/header
        if row and row[0] == "Header_Table0_Netbios_Name0":
            break
    index = row.index("Details_Table0_Netbios_Name0")  # find where your columns begin
    result = []  # storage for the rows we're interested in
    for row in reader:  # read the rest of the CSV row by row
        if row and row[index][:4] in {"SMZ-", "MTR-"}:  # only include these rows
            result.append(row[index:])  # trim and append to the `result` list

print(result[10])  # etc.
# ['MTR-PC0BXQE6-LB', 'PR2', 'anisita', 'VALUEADDCO', 'VALUEADDCO', 'Heartbeat Discovery',
#  '07.12.2017 17:47:51', '13']

应该这样做。