নিউলাইন সীমিত ফাইলগুলি পড়ার এবং নিউলাইনগুলি বাতিল করার জন্য সেরা পদ্ধতি?


84

পাইথনের নিউলাইনে সীমিত ফাইলগুলিতে পড়ার সময় আমি নিউলাইনগুলি থেকে মুক্তি পাওয়ার সর্বোত্তম উপায়টি নির্ধারণ করার চেষ্টা করছি।

আমি যা নিয়ে এসেছি তা হল নীচের কোডগুলি, পরীক্ষার জন্য থ্রোওয়ে কোড অন্তর্ভুক্ত করুন।

import os

def getfile(filename,results):
   f = open(filename)
   filecontents = f.readlines()
   for line in filecontents:
     foo = line.strip('\n')
     results.append(foo)
   return results

blahblah = []

getfile('/tmp/foo',blahblah)

for x in blahblah:
    print x

পরামর্শ?


বিভাজন ("/ এন") ব্যবহার সম্পর্কে কী?
jle


আমি মনে করি ফাইলটিও বন্ধ করে দেওয়া ভাল
পাউয়েস প্রাগ

উত্তর:


196
lines = open(filename).read().splitlines()

4
এই উত্তরটি আমি যা যাচ্ছিলাম তা করে, আমি নিশ্চিত যে আমাকে কিছু ত্রুটি পরীক্ষা করা এবং এগুলি যুক্ত করতে হবে তবে এই নির্দিষ্ট প্রয়োজনের জন্য এটি দুর্দান্ত। উত্তর সরবরাহ করার জন্য আপনাকে সবাইকে ধন্যবাদ!
সৌর্য

আমি এটি পছন্দ করি তবে আপনি যদি ফাইল হ্যান্ডেলটি সংরক্ষণ না করেন তবে আপনি কীভাবে ফাইলটি বন্ধ করবেন? নাকি এটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে গেছে?
আইজে কেনেডি

6
সিপিথনের সাহায্যে ফাইল অবজেক্টের জন্য রেফারেন্স গণনাটি শূন্যে চলে যাবে একবার এটি আর ব্যবহারে নেই এবং ফাইলটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। জাইথন ​​এবং আয়রন পাইথনের মতো খাঁটি জিসি'ড প্রয়োগের জন্য, জিসি চালানো না হওয়া পর্যন্ত ফাইলটি বন্ধ নাও হতে পারে - সুতরাং এই ক্ষুদ্র প্রকরণটি সর্বোত্তম নাও হতে পারে।
কর্ট হ্যাগেনলোচার

4
8 গিগাবাইট র‌্যাম সহ ম্যাক ওএস এক্স 10.7.5 এ, আমি 2047 এমবি পর্যন্ত ফাইল পড়তে পারি (আমার সংজ্ঞা: 1 এমবি = 1024 x 1024 বাইট)। 2048MB মেমোরিরর ব্যতিক্রম নিক্ষেপ করবে।
হাই ভু

4
@WKPlus চমৎকার প্রশ্ন - উত্তর "এটা নির্ভর করে" stackoverflow.com/a/15099341/994153 (CPython এটা বন্ধ করে দিবেন যেহেতু রেফারেন্স গণনা শুন্যতে ড্রপ, কিন্তু অন্যান্য পাইথন বাস্তবায়নের তাই সেরা এটা স্পষ্ট করতে, বন্ধ তাই না পারে )
কলিন ডি বেনেট

23

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

lines = (line.rstrip('\n') for line in open(filename))

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

lines = (line.rstrip() for line in open(filename))

এটি কি আরএইচএসের চারপাশে থাকা উচিত নয়, () নয়?
অ্যান্ড্রুব

8
@ অ্যান্ড্রুব ইউজিং () একটি জেনারেটর এক্সপ্রেশন দেয়, যা ব্যবহারের মতো মেমোরি ব্যবহার করে না [] (একটি তালিকা বোধগম্যতা)
জোনাথন হার্টলি

9

আপনি এই পদ্ধতির সম্পর্কে কি মনে করেন?

with open(filename) as data:
    datalines = (line.rstrip('\r\n') for line in data)
    for line in datalines:
        ...do something awesome...

জেনারেটর এক্সপ্রেশন পুরো ফাইলটিকে মেমরিতে লোড করা এড়ানো এবং withফাইলটি বন্ধ করে দেওয়া নিশ্চিত করে


এটি মূলত @ টিমো লিন্নার উত্তর কয়েক বছর আগে পোস্ট করার মতই ...
মার্টিনিউ


4

কেবল জেনারেটর এক্সপ্রেশন ব্যবহার করুন:

blahblah = (l.rstrip() for l in open(filename))
for x in blahblah:
    print x

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


3

আমি এটি ব্যবহার করি

def cleaned( aFile ):
    for line in aFile:
        yield line.strip()

তারপরে আমি এই জাতীয় জিনিসগুলি করতে পারি।

lines = list( cleaned( open("file","r") ) )

বা, আমি অতিরিক্ত ফাংশন দিয়ে পরিষ্কার করে প্রসারিত করতে পারি, উদাহরণস্বরূপ, ফাঁকা লাইনগুলি ছেড়ে দিন বা মন্তব্য লাইনগুলি বা যে কোনও কিছু এড়িয়ে যান।


2

আমি এটি এইভাবে করব:

f = open('test.txt')
l = [l for l in f.readlines() if l.strip()]
f.close()
print l

কার্ট হ্যাগেনলোচের উত্তরটি প্রযুক্তিগত দিক থেকে আরও ভাল, যদি আপনাকে প্রতিটি লাইনে অন্য প্রসেসিং যুক্ত করতে হয় তবে এই উত্তরটি একটি ভাল সূচনার পয়েন্ট।
টমঅনটাইম

এটি ফাঁকা লাইনগুলি ফিল্টার করার উদ্দেশ্যে ছিল কিনা তা নিশ্চিত নয়, তবে এটির চেয়ে এটি আরও সংক্ষিপ্ত ... if l.strip() is not '', যা আমার ক্ষেত্রে আমার প্রয়োজন।
জাচ ইয়ং
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.