2017-12-21 6 views
0

csv fileからリストまたはnumpy配列を作成するより良い方法はありますか?私が求めていることは、以下のコードで行ったよりも、それをやり直す方法です。CSVをリストまたは配列に解析する方が良い

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") 
+0

パンダのデータフレームはどうですか? –

+0

@Garbage私はまだそれらを学んでいない。例は歓迎です – user2978216

答えて

0

すべての例外とCSV形式の奇妙な問題に対処しない限り、手動でCSV構造を解析しないでください。 Pythonはその点に関して、csvモジュールについて説明しました。

あなたのケースでは、主な問題はデータに由来します.1つのファイルに2つの異なるCSV構造があるように見えるので、最初に2番目の構造が始まる場所を探す必要があります。さらに、コードからは、Details_Table0_Netbios_Name0より前のすべての列を除外し、がSMZ-または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'] 

トリックを行う必要があります。

+0

ありがとう!また、コメントは非常に役立ちます – user2978216

1

私はあなたが何をしたいかわからないが、これはラインでCSV形式のラインを読み、リスト

+0

お試しいただきありがとうございます:D私の最初の投稿にはcsvファイルへのリンクがあります。コードをダウンロードして試すことができます。 (スポイラーアラート:それは動作しません) – user2978216

+0

@ user2978216 csvファイルを自分で解析するよりも、csvライブラリを使用する方が良い方法です。 csvライブラリは、共通の方言だけでなく、必要に応じてカスタマイズされた方言もサポートしています。 https://docs.python.org/3/library/csv.html – antonagestam

+0

@ user2978216 csvの最初の3行を削除し、それを実行して – funkyFunk

0

サンプルコード

import csv 
csv_file = 'sample.csv' 
with open(csv_file) as fh: 
    reader = csv.reader(fh) 
    for row in reader: 
    print(row) 
としてそれを保存する必要があります。この

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

print (ll) 

を試してみてください

sample.csv

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

いつでもPandasを使用できます。例として、

import pandas as pd 
import numpy as np 

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

変換するには、それを好きな数値タイプに変換する必要があります。私はあなたが1行で全体を書くことができますね。

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

また、次のことが可能です。

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

を実行し、対応するnumpy配列を取得してください。 'result = df.values ' – buenaonda

+0

本当に、私は' astype() 'を追加しました。 – andrewnagyeb

1

あなたはそれがあなたのサンプルファイルで正しく動作させるためにパンダを使用し、ヘッダ列を指定することができます

import pandas as pd 

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

あなたは使用してコンテンツを確認することができます。

>>> df.head() 

あなたは

>>> df.columns 

を使用してヘッダを確認することができますし、それは、CSVファイルを解析して読み取るために多くのオプションが付属しています

>>> np_arr = df.values 

を使用することができますnumpy配列に変換します。詳細については、docs

関連する問題