পাইথন CSV তালিকাতে আমদানি করে


193

আমার কাছে প্রায় 2000 টি রেকর্ড সহ একটি সিএসভি ফাইল রয়েছে।

প্রতিটি রেকর্ডের একটি স্ট্রিং থাকে এবং এটিতে একটি বিভাগ:

This is the first line,Line1
This is the second line,Line2
This is the third line,Line3

আমাকে এই ফাইলটি দেখতে এমন একটি তালিকার মধ্যে পড়তে হবে:

data = [('This is the first line', 'Line1'),
        ('This is the second line', 'Line2'),
        ('This is the third line', 'Line3')]

পাইথন ব্যবহারের জন্য আমার প্রয়োজন তালিকায় এই সিএসভি কীভাবে আমদানি করতে পারেন?


2
তারপরে csvমডিউলটি ব্যবহার করুন : docs.python.org/2/library/csv.html
ফুরাস

4
যদি আপনার প্রশ্নের উপযুক্ত উত্তর আছে তবে তা গ্রহণ করুন accept
ম্যাকিয়েজ গোল

উত্তর:


305

সিএসভি মডিউলটি ব্যবহার করে :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = list(reader)

print(data)

আউটপুট:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

আপনার যদি টিপলস দরকার হয়:

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    data = [tuple(row) for row in reader]

print(data)

আউটপুট:

[('This is the first line', 'Line1'), ('This is the second line', 'Line2'), ('This is the third line', 'Line3')]

ওল্ড পাইথন 2 উত্তর, মডিউলটিও ব্যবহার করে csv:

import csv
with open('file.csv', 'rb') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print your_list
# [['This is the first line', 'Line1'],
#  ['This is the second line', 'Line2'],
#  ['This is the third line', 'Line3']]

4
আপনি 'আর' এর পরিবর্তে 'আরবি' ব্যবহার করেন কেন?
ইমরেক

5
@ ড্রঙ্কনমাস্টার, bপাঠ্য মোডের বিপরীতে ফাইলটিকে বাইনারি মোডে খোলার কারণ করে। কিছু সিস্টেমে পাঠ্য মোডের অর্থ এটি \nপড়তে বা লেখার সময় প্ল্যাটফর্ম-নির্দিষ্ট নতুন লাইনে রূপান্তরিত হয়। দস্তাবেজগুলি দেখুন
ম্যাকিয়েজ গোল 24'15

7
এটি পাইথন ৩.x-তে কাজ করে না: "সিএসভি।এরর: পুনরুক্তিকারীকে স্ট্রিং ফিরিয়ে দেওয়া উচিত, বাইটস নয় (আপনি কি টেক্সট মোডে ফাইলটি খোলেন?)" পাইথন ৩.x-এ কাজ করে এমন উত্তরের জন্য নীচে দেখুন
গিলবার্ট

2
ডিবাগিংয়ের কয়েক সেকেন্ড সময় বাঁচাতে আপনার প্রথম সমাধানটির জন্য সম্ভবত একটি নোট যুক্ত করা উচিত, যেমন "পাইথন ২.x সংস্করণ"
9:53

আপনার প্রথম সমাধানটি কীভাবে ব্যবহার করবেন তবে সিএসভি ফাইল থেকে কিছু কলামই পাবেন?
সিগুর

54

পাইথন 3 এর জন্য আপডেট করা :

import csv

with open('file.csv', newline='') as f:
    reader = csv.reader(f)
    your_list = list(reader)

print(your_list)

আউটপুট:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

নির্দিষ্ট 'r'করা ডিফল্ট মোড, সুতরাং এটি নির্দিষ্ট করা অপ্রয়োজনীয়। দস্তাবেজগুলি আরও উল্লেখ করেছে যে csvfile যদি কোনও ফাইল অবজেক্ট হয় তবে এটি নতুন লাইন = '' দিয়ে খোলা উচিত।
এএমসি

44

পান্ডস ডেটা নিয়ে কাজ করার ক্ষেত্রে বেশ ভাল। এটি কীভাবে ব্যবহার করবেন তা এখানে একটি উদাহরণ:

import pandas as pd

# Read the CSV into a pandas data frame (df)
#   With a df you can do many things
#   most important: visualize data with Seaborn
df = pd.read_csv('filename.csv', delimiter=',')

# Or export it in many ways, e.g. a list of tuples
tuples = [tuple(x) for x in df.values]

# or export it as a list of dicts
dicts = df.to_dict().values()

একটি বড় সুবিধা হ'ল পান্ডাস শিরোনাম সারিগুলির সাথে স্বয়ংক্রিয়ভাবে ডিল করে।

আপনি যদি সিবর্ন সম্পর্কে না শুনে থাকেন তবে আমি এটিটি একবার দেখার পরামর্শ দিই।

আরও দেখুন: আমি পাইথন দিয়ে সিএসভি ফাইলগুলি কীভাবে পড়তে এবং লিখতে পারি?

পান্ডস # 2

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
dicts = df.to_dict('records')

ডিএফ এর বিষয়বস্তু হ'ল:

     country   population population_time    EUR
0    Germany   82521653.0      2016-12-01   True
1     France   66991000.0      2017-01-01   True
2  Indonesia  255461700.0      2017-01-01  False
3    Ireland    4761865.0             NaT   True
4      Spain   46549045.0      2017-06-01   True
5    Vatican          NaN             NaT   True

Dicts বিষয়বস্তু হয়

[{'country': 'Germany', 'population': 82521653.0, 'population_time': Timestamp('2016-12-01 00:00:00'), 'EUR': True},
 {'country': 'France', 'population': 66991000.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': True},
 {'country': 'Indonesia', 'population': 255461700.0, 'population_time': Timestamp('2017-01-01 00:00:00'), 'EUR': False},
 {'country': 'Ireland', 'population': 4761865.0, 'population_time': NaT, 'EUR': True},
 {'country': 'Spain', 'population': 46549045.0, 'population_time': Timestamp('2017-06-01 00:00:00'), 'EUR': True},
 {'country': 'Vatican', 'population': nan, 'population_time': NaT, 'EUR': True}]

পান্ডস # 3

import pandas as pd

# Get data - reading the CSV file
import mpu.pd
df = mpu.pd.example_df()

# Convert
lists = [[row[col] for col in df.columns] for row in df.to_dict('records')]

বিষয়বস্তু listsহ'ল:

[['Germany', 82521653.0, Timestamp('2016-12-01 00:00:00'), True],
 ['France', 66991000.0, Timestamp('2017-01-01 00:00:00'), True],
 ['Indonesia', 255461700.0, Timestamp('2017-01-01 00:00:00'), False],
 ['Ireland', 4761865.0, NaT, True],
 ['Spain', 46549045.0, Timestamp('2017-06-01 00:00:00'), True],
 ['Vatican', nan, NaT, True]]

tuples = [tuple(x) for x in df.values]tuples = list(df.itertuples(index=False))পরিবর্তে লেখা যেতে পারে । নোট করুন যে পান্ডা ডকস .valuesপক্ষের পক্ষে ব্যবহারকে নিরুৎসাহিত করে .to_numpy()। তৃতীয় উদাহরণটি আমার কাছে বিভ্রান্তিকর। প্রথমত, কারণ ভেরিয়েবলটির নামকরণ করা হয়েছে tuples, যা বোঝায় যে এটি টিপলগুলির একটি তালিকা, যখন এটি আসলে তালিকার একটি তালিকা। দ্বিতীয়ত, কারণ যতদূর আমি বলতে পারি যে সম্পূর্ণ এক্সপ্রেশনটি প্রতিস্থাপন করা যেতে পারে df.to_list()। দ্বিতীয় উদাহরণটি এখানে সত্যিই প্রাসঙ্গিক কিনা তাও আমি জানি না।
এএমসি

9

পাইথন 3 এর জন্য আপডেট:

import csv
from pprint import pprint

with open('text.csv', newline='') as file:
    reader = csv.reader(file)
    res = list(map(tuple, reader))

pprint(res)

আউটপুট:

[('This is the first line', ' Line1'),
 ('This is the second line', ' Line2'),
 ('This is the third line', ' Line3')]

Csvfile যদি কোনও ফাইল অবজেক্ট হয় তবে এটি দিয়ে খোলা উচিত newline=''
সিএসভি মডিউল


list(map())একটি তালিকা বোধগম্য ব্যবহার কেন ? এছাড়াও, দ্বিতীয় কলামের প্রতিটি উপাদানটির শুরুতে শ্বেত স্থানটি লক্ষ্য করুন।
এএমসি

5

আপনি যদি নিশ্চিত হন যে আপনার ইনপুটটিতে কোনও কমা নেই, বিভাগটি পৃথক করা ছাড়া, আপনি লাইন দ্বারা ফাইল লাইনটি পড়তে পারেন এবং বিভক্ত করতে পারেন ,, তারপরে ফলাফলটি এখানে চাপ দিনList

এটি বলেছিল, দেখে মনে হচ্ছে আপনি কোনও সিএসভি ফাইল খুঁজছেন, সুতরাং আপনি এটির জন্য মডিউলগুলি ব্যবহার করার বিষয়টি বিবেচনা করতে পারেন


4
result = []
for line in text.splitlines():
    result.append(tuple(line.split(",")))

1
আপনি কি এই পোস্টে কিছুটা ব্যাখ্যা যোগ করতে পারেন? কোডটি কেবল (কখনও কখনও) ভাল তবে কোড এবং ব্যাখ্যাটি (বেশিরভাগ বার) ভাল
বারানকা

3
আমি জানি ব্যারাঙ্কার মন্তব্যটি এক বছরেরও বেশি পুরনো, তবে যে কেউ এ নিয়ে হোঁচট খায় এবং তা বুঝতে পারেন না: টেক্সট লাইনের জন্য। স্প্লিটলাইনস (): প্রতিটি স্বতন্ত্র রেখাকে টেম্প ভেরিয়েবল "লাইনে" রাখে। লাইন.স্প্লিট (",") কমাতে বিভক্ত স্ট্রিংগুলির একটি তালিকা তৈরি করে। tuple (~) তালিকায় একটি তালিকায় রাখে এবং সংযোজন (~) ফলাফলের সাথে যুক্ত করে। লুপের পরে, ফলাফলটি হল টিউপসগুলির একটি তালিকা এবং প্রতিটি টিপল একটি লাইন থাকে এবং প্রতিটি টিপল উপাদান সিএসভি ফাইলে একটি উপাদান থাকে।
লুই

@ লুইস যা বলেছিল সেগুলি ছাড়াও, ব্যবহার করার দরকার নেই .read().splitlines(), আপনি সরাসরি ফাইলের প্রতিটি লাইন ধরে পুনরাবৃত্তি করতে পারেন: for line in in_file: res.append(tuple(line.rstrip().split(",")))এছাড়াও, মনে রাখবেন যে ব্যবহার করার .split(',')অর্থ দ্বিতীয় স্তম্ভের প্রতিটি উপাদান অতিরিক্ত শ্বেত স্পেস দিয়ে শুরু হবে।
এএমসি

আমি স্রেফ উপরে ভাগ করা কোডটিতে সংযোজন: line.rstrip()-> line.rstrip('\n')
এএমসি

3

ইতিমধ্যে মন্তব্যে বলা হয়েছে আপনি csvপাইথনে লাইব্রেরিটি ব্যবহার করতে পারেন । সিএসভির অর্থ কমা দ্বারা পৃথক হওয়া মান যা আপনার ক্ষেত্রে ঠিক মনে হয়: একটি লেবেল এবং একটি মান কমা দ্বারা পৃথক করা।

বিভাগ এবং মান প্রকার হওয়ায় আমি টিউপসগুলির তালিকার পরিবর্তে অভিধানের ধরণটি ব্যবহার করব।

যাইহোক নীচের কোডে আমি দুটি উপায় দেখাই: dঅভিধান এবং lএটি টিপলগুলির তালিকা।

import csv

file_name = "test.txt"
try:
    csvfile = open(file_name, 'rt')
except:
    print("File not found")
csvReader = csv.reader(csvfile, delimiter=",")
d = dict()
l =  list()
for row in csvReader:
    d[row[1]] = row[0]
    l.append((row[0], row[1]))
print(d)
print(l)

ফাইলটি পরিচালনা করতে একটি প্রসঙ্গ পরিচালক ব্যবহার করবেন না কেন? কেন আপনি দুটি ভিন্ন পরিবর্তনশীল নামকরণ কনভেনশন মেশাচ্ছেন? নন (row[0], row[1])দুর্বল / আরো ত্রুটি-প্রবণ শুধু ব্যবহার না করে tuple(row)?
এএমসি

আপনি কেন ভাবেন যে টিপল (সারি) করা কম ত্রুটি প্রবণ? আপনি কোন পরিবর্তনশীল নামকরণ কনভেনশনটি উল্লেখ করছেন? দয়া করে একটি সরকারী অজগর নামকরণ কনভেনশন লিঙ্ক করুন। যতদূর আমি জানি ফাইলগুলি হ্যান্ডেল করার একটি ভাল উপায় হ'ল: কনটেক্সট হ্যান্ডলারের অর্থ কী?
ফ্রান্সেস্কো বোই

আপনি কেন ভাবেন যে টিপল (সারি) করা কম ত্রুটিযুক্ত? কারণ এটির জন্য আপনার প্রতিটি সূচি ম্যানুয়ালি লেখার দরকার নেই। আপনি যদি কোনও ভুল করেন বা উপাদানগুলির সংখ্যা পরিবর্তন হয় তবে আপনাকে ফিরে গিয়ে আপনার কোডটি পরিবর্তন করতে হবে। চেষ্টা বাদে ঠিক আছে, প্রসঙ্গের পরিচালকরা হ'ল বিবৃতি সহ। আপনি যেমন বিষয়ের উপর সম্পদ প্রচুর জানতে পারেন এই এক।
এএমসি

আমি দেখতে পাচ্ছি না যে কনটেক্সট ম্যানেজার ওল'এর ভাল চেষ্টা-বাদে ভাল করার চেয়ে ভাল be অন্যটির জন্য ইতিবাচক দিকটি হল আপনি কম কোড টাইপ করুন; বাকিগুলির জন্য যদি উপাদানগুলির সংখ্যা (আমি অনুমান করি আপনি কলামগুলির সংখ্যাটি বোঝায়) পরিবর্তন করে তবে আমার এটি আরও ভাল হয় কারণ এটি কেবলমাত্র পছন্দসই মানগুলি বের করে যখন অন্যটি সমস্ত এক্সেলটি বের করে। কোনও নির্দিষ্ট প্রয়োজনীয়তা ব্যতীত আপনি কোনটি ভাল তা বলতে পারবেন না তাই এটির পক্ষে সময় নষ্ট করা যা ভাল:
এক্ষেত্রে

আমি দেখতে পাচ্ছি না যে কনটেক্সট ম্যানেজার ওল'এর ভাল চেষ্টা-বাদে ভাল করার চেয়ে ভাল be দয়া করে আমার আগের মন্তব্যটি দেখুন, প্রসঙ্গের পরিচালক ব্যতীত চেষ্টাটি প্রতিস্থাপন করবেন না
এএমসি

2

একটি সাধারণ লুপ যথেষ্ট হবে:

lines = []
with open('test.txt', 'r') as f:
    for line in f.readlines():
        l,name = line.strip().split(',')
        lines.append((l,name))

print lines

1
কিছু এন্ট্রিগুলির মধ্যে কমা থাকলে কী হবে?
টনি এনিস

@ টনিইনিস তারপরে আপনাকে আরও উন্নত প্রসেসিং লুপ ব্যবহার করতে হবে। উপরের ম্যাকিয়েজের উত্তরটি দেখায় যে কীভাবে পাইথনের সাথে এই ক্রিয়াকলাপটি চালানোর জন্য আসে সিএসভি পার্সার ব্যবহার করতে হয়। এই পার্সারটিতে সম্ভবত আপনার প্রয়োজনীয় সমস্ত যুক্তি রয়েছে।
হান্টার ম্যাকমিলেন

1

দুর্ভাগ্যক্রমে আমি বিদ্যমান উত্তরগুলির মধ্যে বিশেষভাবে সন্তোষজনক দেখতে পাই না।

এখানে সিএসভি মডিউলটি ব্যবহার করে একটি সোজা এবং সম্পূর্ণ পাইথন 3 সমাধান দেওয়া হয়েছে ।

import csv

with open('../resources/temp_in.csv', newline='') as f:
    reader = csv.reader(f, skipinitialspace=True)
    rows = list(reader)

print(rows)

লক্ষ্য করুন skipinitialspace=Trueযুক্তি । এটি প্রয়োজনীয়, যেহেতু দুর্ভাগ্যক্রমে, ওপির সিএসভিতে প্রতিটি কমা পরে সাদা স্থান রয়েছে ace

আউটপুট:

[['This is the first line', 'Line1'], ['This is the second line', 'Line2'], ['This is the third line', 'Line3']]

0

আপনার প্রয়োজনীয়তাগুলি কিছুটা প্রসারিত করা এবং ধরে নেওয়া যে আপনি লাইনের ক্রমটির কোনও যত্ন নেই এবং এগুলি বিভাগের আওতায় অন্তর্ভুক্ত করতে চান, নীচের সমাধানটি আপনার পক্ষে কাজ করতে পারে:

>>> fname = "lines.txt"
>>> from collections import defaultdict
>>> dct = defaultdict(list)
>>> with open(fname) as f:
...     for line in f:
...         text, cat = line.rstrip("\n").split(",", 1)
...         dct[cat].append(text)
...
>>> dct
defaultdict(<type 'list'>, {' CatA': ['This is the first line', 'This is the another line'], ' CatC': ['This is the third line'], ' CatB': ['This is the second line', 'This is the last line']})

আপনি এই বিভাগে কী অনুসারে অভিধানে প্রাসঙ্গিক সমস্ত লাইন পাবেন।


0

বহুমাত্রিক অ্যারেতে সিএসভি আমদানি করার জন্য পাইথন 3.x এর সবচেয়ে সহজ উপায় এবং কোনও কিছু আমদানি না করেই কেবলমাত্র 4 টি লাইন কোড!

#pull a CSV into a multidimensional array in 4 lines!

L=[]                            #Create an empty list for the main array
for line in open('log.txt'):    #Open the file and read all the lines
    x=line.rstrip()             #Strip the \n from each line
    L.append(x.split(','))      #Split each line into a list and add it to the
                                #Multidimensional array
print(L)

সাবধান, এটি একটি তালিকা, অ্যারে না! ফাইল অবজেক্টটি সঠিকভাবে পরিচালনা করতে একটি প্রসঙ্গ পরিচালক ব্যবহার করবেন না কেন? নোট করুন যে এই দ্রবণটি প্রতিটি সারিতে দ্বিতীয় আইটেমের অতিরিক্ত শ্বেত স্থান ছেড়ে যায় এবং কোনও ডাটাতে কমা থাকলে তা ব্যর্থ হবে।
এএমসি

-1

এর পরে কোডের একটি অংশ যা সিএসভি মডিউল ব্যবহার করে তবে সিএসভি টেবিলের শিরোনাম যা প্রথম লাইনটি ব্যবহার করে ডিক্টের তালিকায় ফাইল সিএসভি বিষয়বস্তু আহরণ করে

import csv
def csv2dicts(filename):
  with open(filename, 'rb') as f:
    reader = csv.reader(f)
    lines = list(reader)
    if len(lines) < 2: return None
    names = lines[0]
    if len(names) < 1: return None
    dicts = []
    for values in lines[1:]:
      if len(values) != len(names): return None
      d = {}
      for i,_ in enumerate(names):
        d[names[i]] = values[i]
      dicts.append(d)
    return dicts
  return None

if __name__ == '__main__':
  your_list = csv2dicts('file.csv')
  print your_list

1
শুধু ব্যবহার csv.DictReaderকরবেন না কেন ?
এএমসি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.