পাইথন সহ একটি পাঠ্য ফাইল কীভাবে একটি তালিকায় বা একটি অ্যারে পড়তে হয়


176

আমি পাঠ্য ফাইলের লাইনগুলি একটি তালিকা বা অজগরের অ্যারেতে পড়ার চেষ্টা করছি। আমার কেবল তালিকা বা অ্যারে তৈরির পরে কোনও আইটেম স্বতন্ত্রভাবে অ্যাক্সেস করতে সক্ষম হওয়া দরকার।

পাঠ্য ফাইলটি নিম্নরূপে ফর্ম্যাট করা হয়েছে:

0,0,200,0,53,1,0,255,...,0.

যেখানে ...উপরেরটি রয়েছে, সেখানে প্রকৃত পাঠ্য ফাইলটিতে আরও কয়েক হাজার বা হাজার হাজার আইটেম রয়েছে।

একটি তালিকাতে ফাইলটি পড়ার চেষ্টা করার জন্য আমি নীচের কোডটি ব্যবহার করছি:

text_file = open("filename.dat", "r")
lines = text_file.readlines()
print lines
print len(lines)
text_file.close()

আমি যে আউটপুট পাই তা হ'ল:

['0,0,200,0,53,1,0,255,...,0.']
1

স্পষ্টতই এটি পৃথক আইটেমের তালিকার চেয়ে পুরো ফাইলটি কেবল একটি আইটেমের তালিকায় পড়ছে। আমি কি ভুল করছি?


1
ঠিক যেমন একটি নোট। দেখে মনে হচ্ছে এই প্রশ্নটির পুনরায় প্রতিস্থাপন করা উচিত যে কীভাবে পাইথনের একটি তালিকায় কোনও সিএসভি ফাইল পড়তে হয়। তবে আমি 4 বছর আগে ওপি এর মূল উদ্দেশ্যগুলি স্থগিত করেছি যা আমি জানি না।
ডেমোঙ্গোলেম

সম্পর্কিত, সম্ভবত এর সদৃশ: স্ট্যাকওভারফ্লো / সিকিউশনস
এএমসি


1
প্রকৃতপক্ষে, শীর্ষস্থানীয় উত্তরের দিকে তাকানো, এটি স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 3277503/… এর সদৃশ ।
এএমসি

উত্তর:


135

আপনার স্ট্রিংটি ব্যবহার করে মানগুলির তালিকায় বিভক্ত করতে হবে split()

সুতরাং,

lines = text_file.read().split(',')

1
আমি মনে করি যে এই উত্তর ভাল না যেতে পারে ... তুমি একাধিক লাইন বিবেচনা যদি .csvফাইল (যেমন ওপি উল্লেখ), যেমন, একটি ফাইল সারিতে বর্ণমালা 3 ধারণকারী ( a,b,c, d,e,fইত্যাদি) পদ্ধতি আপনি কি পেতে উপরে বর্ণিত আবেদন এটির মতো একটি তালিকা: ['a', 'b', 'c\nd', 'e', ... ](আইটেমটি নোট করুন 'c\nd')। উপরের সমস্যাটি সত্ত্বেও আমি এটি যুক্ত করতে চাই, এই পদ্ধতিটি একটি একক মেগা-তালিকার পৃথক সারি থেকে ডেটা ভেঙে দেয়, সাধারণত রেকর্ড-ভিত্তিক ডেটা ফাইল প্রক্রিয়াকরণের সময় আমি যা চাই তা নয়।
gboffi

বিভাজন নতুন লাইনে ছেড়ে চলেছে। এটি করবেন না, csvমডিউল বা অন্য কোনও বিদ্যমান পার্সার ব্যবহার করুন
জিন-ফ্রানসোইস ফ্যাব্রে

42

আপনি নাম্পী লোডটেক্সট ব্যবহার করতে পারেন

from numpy import loadtxt
lines = loadtxt("filename.dat", comments="#", delimiter=",", unpack=False)

1
আমারও এটি দরকার আমি একটি রাস্পবেরি পাইতে লক্ষ্য করেছি যে অদ্ভুত সত্যই ধীর গতিতে কাজ করে। এই অ্যাপ্লিকেশনটির জন্য আমি একটি ফাইল খোলার জন্য এবং এটি প্রতিটি লাইনে লাইনে পড়তে ফিরে গিয়েছিলাম।
গিউস

2
dtype : data-typeপ্যারামিটারের মাধ্যমেও এটি বিন্যাস নির্দিষ্ট করার জন্য দরকারী । docs.scipy.org/doc/numpy/references/generated/numpy.loadtxt.html পান্ডাস রিড_সিএসভি ব্যবহার করা খুব সহজ। তবে আমি এটির জন্য বিন্যাস নির্দিষ্ট করার কোনও উপায় দেখিনি। এটি আমার ফাইল থেকে ভাসমানগুলি পড়ছিল, যেখানে আমার স্ট্রিং দরকার। লোডটেক্সট দেখানোর জন্য @ তিরুকে ধন্যবাদ
ওজগুর ওজটুর্ক

1
যদি txt ফাইলগুলিতে স্ট্রিং থাকে, তবে dtype নির্দিষ্ট করা উচিত, সুতরাং এটি লাইন = লোডটেক্সট ("filename.dat", dtype = str, মন্তব্য = "#", ডিলিমিটার = ",", আনপ্যাক = মিথ্যা)
অ্যালেক্স M981 এর মতো হওয়া উচিত

19

সুতরাং আপনি তালিকার একটি তালিকা তৈরি করতে চান ... আমাদের খালি তালিকা দিয়ে শুরু করা দরকার

list_of_lists = []

এরপরে, আমরা ফাইলের বিষয়বস্তু পড়ি, এক এক করে লাইন

with open('data') as f:
    for line in f:
        inner_list = [elt.strip() for elt in line.split(',')]
        # in alternative, if you need to use the file content as numbers
        # inner_list = [int(elt.strip()) for elt in line.split(',')]
        list_of_lists.append(inner_list)

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

by_cols = zip(*list_of_lists)

আর একটি সাধারণ ব্যবহার প্রতিটি কলামে একটি নাম দেওয়া

col_names = ('apples sold', 'pears sold', 'apples revenue', 'pears revenue')
by_names = {}
for i, col_name in enumerate(col_names):
    by_names[col_name] = by_cols[i]

যাতে আপনি একজাতীয় ডেটা আইটেমগুলিতে পরিচালনা করতে পারেন

 mean_apple_prices = [money/fruits for money, fruits in
                     zip(by_names['apples revenue'], by_names['apples_sold'])]

আমি যা লিখেছি তার বেশিরভাগই csvস্ট্যান্ডার্ড লাইব্রেরি থেকে মডিউলটি ব্যবহার করে দ্রুত করা যায় । অন্য তৃতীয় পক্ষের মডিউলটি হ'ল pandasএটি আপনাকে একটি সাধারণ ডেটা বিশ্লেষণের বেশিরভাগ দিক স্বয়ংক্রিয় করতে দেয় (তবে বেশ কয়েকটি নির্ভরতা রয়েছে)।


আপডেট পাইথন 2 যদিও zip(*list_of_lists)রিটার্ন একটি পৃথক (পক্ষান্তরিত) তালিকার তালিকা, পাইথন 3 অবস্থা পরিবর্তিত হয়েছে এবং zip(*list_of_lists)আয় একটি জিপ বস্তুর যে subscriptable নয়।

আপনার যদি সূচিকৃত অ্যাক্সেসের প্রয়োজন হয় তবে আপনি ব্যবহার করতে পারেন

by_cols = list(zip(*list_of_lists))

এটি আপনাকে পাইথনের উভয় সংস্করণে তালিকার একটি তালিকা দেয়।

অন্যদিকে, আপনার যদি সূচিকৃত অ্যাক্সেসের প্রয়োজন না হয় এবং আপনি যা চান তা কেবল কলামের নাম অনুসারে সূচিযুক্ত অভিধান বানাতে হবে, একটি জিপ অবজেক্ট ঠিক আছে ...

file = open('some_data.csv')
names = get_names(next(file))
columns = zip(*((x.strip() for x in line.split(',')) for line in file)))
d = {}
for name, column in zip(names, columns): d[name] = column

ওপি জানিয়েছে যে তারা একটি সিএসভি থেকে তথ্য তালিকার চেয়েছিল, "তালিকার তালিকা" নয়। কেবলমাত্র csvমডিউলটি ব্যবহার করুন ...
ব্লেয়ারজ 23

4

এই প্রশ্নটি জিজ্ঞাসা করছে যে একটি ফাইল থেকে কমা-বিচ্ছিন্ন মান বিষয়বস্তু একটি পুনরাবৃত্তযোগ্য তালিকায় কীভাবে পড়তে হবে:

0,0,200,0,53,1,0,255,...,0.

এটি করার সবচেয়ে সহজ উপায় হল csvমডিউলটি নিম্নরূপ:

import csv
with open('filename.dat', newline='') as csvfile:
    spamreader = csv.reader(csvfile, delimiter=',')

এখন, আপনি সহজেই এর spamreaderমতো পুনরাবৃত্তি করতে পারেন :

for row in spamreader:
    print(', '.join(row))

আরও উদাহরণের জন্য ডকুমেন্টেশন দেখুন ।

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