নিউলাইন ছাড়া ফাইল পড়বেন কীভাবে?


374

পাইথনে, ডাকছে

temp = open(filename,'r').readlines()

প্রতিটি তালিকার একটি ফাইলে থাকা একটি তালিকার ফলাফল। এটি কিছুটা বোকা তবে তবুও: readlines()প্রতিটি উপাদানকে নিউলাইন চরিত্রও লিখে দেয়, এমন কিছু যা আমি ঘটতে চাই না।

আমি কীভাবে এড়াতে পারি?


4
ব্যবহারের ফালা: [l.strip('\n\r') for l in temp]। বা এমনকি rstrip। এবং পুনরাবৃত্তি যেহেতু এখানে এটি in openপরিবর্তে হতে পারে in temp
gorlum0

11
আমি পাই যদি পাইথন 3 এ খোলা newlineযুক্তিটির সেই চম্পড ট্রেলিং নিউলাইনগুলিতে সেট করার কোনও মান থাকত ।
jxramos 21

উত্তর:


554

আপনি পুরো ফাইলটি এবং বিভক্ত লাইনগুলি ব্যবহার করে এটি পড়তে পারেন str.splitlines:

temp = file.read().splitlines()

অথবা আপনি হাতছাড়া করে নতুন লাইনটি ছিনিয়ে নিতে পারেন:

temp = [line[:-1] for line in file]

দ্রষ্টব্য: এই শেষ সমাধানটি কেবল তখনই কাজ করে যদি ফাইলটি একটি নতুন লাইন দিয়ে শেষ হয়, অন্যথায় শেষ লাইনটি একটি অক্ষর হারাবে।

এই ধৃষ্টতা অধিকাংশ ক্ষেত্রে (বিশেষ করে টেক্সট এডিটর, যা প্রায়ই দ্বারা নির্মিত ফাইলের জন্য সত্য না যাহাই হউক না কেন শেষের সম্পর্কে newline যোগ করুন)।

আপনি যদি এড়াতে চান তবে আপনি ফাইলের শেষে একটি নতুন লাইন যুক্ত করতে পারেন:

with open(the_file, 'r+') as f:
    f.seek(-1, 2)  # go at the end of the file
    if f.read(1) != '\n':
        # add missing newline if not already present
        f.write('\n')
        f.flush()
        f.seek(0)
    lines = [line[:-1] for line in f]

বা এর stripপরিবর্তে নতুন বিকল্পটি একটি সহজ বিকল্প :

[line.rstrip('\n') for line in file]

বা এমনকি, যদিও বেশ অপঠনযোগ্য:

[line[:-(line[-1] == '\n') or len(line)+1] for line in file]

যা এই সত্যটির অপব্যবহার করে যে এর ফেরতের মানটি orবুলিয়ান নয়, তবে যে বস্তুর সত্য বা মিথ্যা মূল্যায়ন করা হয়েছিল।


readlinesপদ্ধতি আসলে সমতূল্য:

def readlines(self):
    lines = []
    for line in iter(self.readline, ''):
        lines.append(line)
    return lines

# or equivalently

def readlines(self):
    lines = []
    while True:
        line = self.readline()
        if not line:
            break
        lines.append(line)
    return lines

যেহেতু readline()নিউলাইনটি এটি readlines()রাখে keeps

নোট: থেকে প্রতিসাম্য জন্য পদ্ধতি নেই না নতুন লাইন বিভক্তি যোগ, তাই এর একটি সঠিক অনুলিপি উৎপন্ন মধ্যে ।readlines()writelines()f2.writelines(f.readlines())ff2


1
নোট যা [line.rstrip('\n') for line in file]একের বেশি পেছন সরিয়ে ফেলবে \n
ওয়েজ টার্নার

1
আরও সহজভাবে, [line[:-(line[-1] == '\n') or len(line)+1] for line in file]পরিবর্তে হতে পারে [line[:-(line[-1] == '\n') or None] for line in file]
ওয়েজ টার্নার

10
এই সমাধানগুলি পুরো ফাইলটিকে মেমরির মধ্যে পড়ে। প্রথম বন্ধনীর তালিকা তালিকার বর্গাকার বন্ধনী পরিবর্তন করা একটি জেনারেটর এক্সপ্রেশন তৈরি করে যা আপনাকে একবারে ফাইলের এক লাইনে পুনরাবৃত্তি করতে দেয়: for line in (x.strip() for x in f):
জোসেফ শেডি

2
@ ভেলট্রন এটি আসলেই প্রশ্ন / উত্তরের মূল বিষয় নয়। এছাড়াও: মনে রাখবেন যে withব্লকটি বন্ধ হয়ে গেলে ফাইলগুলি বন্ধ করে দেয় যার অর্থ আপনি করতে পারবেন না with open(...) as f: lines = (line for line in f)এবং linesবাইরে ব্যবহার করতে পারবেন না withকারণ আপনি একটি আই / ও ত্রুটি পাবেন। আপনি জিনপ এক্স ব্যবহার করে অলস হতে পারেন তবে ফাইলটি বন্ধ করার আগে আপনাকে অবশ্যই এটি গ্রাস করতে হবে।
বাকুরিউ

@WesTurner। তবে একের বেশি ট্রেলিং নিউলাইন থাকবে না। অতিরিক্ত নিউলাইনটি পরের খালি লাইনের অংশ হবে
ম্যাড ফিজিকবিদ

38
temp = open(filename,'r').read().split('\n')

14
\r\nতবে নিউলাইন দিয়ে কী হবে ? ;)
ওল্ফ

26
পাইথন স্বয়ংক্রিয়ভাবে সর্বজনীন নিউলাইনগুলি পরিচালনা করে, এভাবে .split('\n')নিউলাইন কনভেনশন থেকে স্বতন্ত্রভাবে সঠিকভাবে বিভক্ত হবে। আপনি যদি বাইনারি মোডে ফাইলটি পড়ে থাকেন তবে বিষয়টি বিবেচনা করবে that সেই ক্ষেত্রে splitlines()সর্বজনীন নিউলাইনগুলি পরিচালনা split('\n')করে যখন না।
বাকুরিউ

7
এবং সর্বদা আছে os.linesep:)
জিজ্ঞাসা

1
@ লার্শ, এটি কিছু পরিস্থিতিতে সাহায্য করবে, আমার সিস্টেমের \r\nলাইনে শেষ রূপান্তরিত হয় না\n , পাঠ্য বা বাইনারি হিসাবে পড়া হোক না কেন, os.linesepযেখানে কাজ \nনা করে সেখানে কাজ করবে । তবে splitlinesস্পষ্টতই আরও ভাল পছন্দ, আপনি যেখানে ফাইলটি ওএসের সাথে মেলে না সেই ক্ষেত্রে উল্লেখ করেছেন। সত্যই আমি বেশিরভাগ ক্ষেত্রে এটি উল্লেখ করেছি যদি এই আলোচনার দিকে তাকানোর লোকেরা এর অস্তিত্ব সম্পর্কে অজানা থাকে।
জিজ্ঞাসাবাদ

1
@ এস্কেচঞ্চন সম্ভবত আপনি পাইথনের একটি পুরানো সংস্করণ ব্যবহার করছেন। আমি বিশ্বাস করি যে পাইথন 3 হিসাবে, সর্বজনীন নিউলাইনগুলি ডিফল্টরূপে সক্ষম করা হয় \r\nআপনি লিনাক্সে চলাকালীন পাঠ্য ফাইলগুলির জন্য রূপান্তরিত হবে।
আর্থার টাক্কা

13

আরেকটি উদাহরণ:

এ সময় এক সারি ফাইল পড়া। স্ট্রিংয়ের শেষে থেকে অযাচিত অক্ষর মুছে ফেলা হচ্ছেstr.rstrip(chars)

with open(filename, 'r') as fileobj:
    for row in fileobj:
        print( row.rstrip('\n') )

আরো দেখুন str.strip([chars]) এবংstr.lstrip([chars])

(অজগর> = ২.০)


10
temp = open(filename,'r').read().splitlines()

5
আপনি কি নিশ্চিত যে এটি ফাইলটি বন্ধ করে দেয়? আমার মনে হয় এটি হয় না, তাই এটি আসলে ওয়ান-লাইনার নয় ...
রায় হুলহা

9

আমি মনে করি এটি সেরা বিকল্প।

temp = [line.strip() for line in file.readlines()]

8
এই সমাধানটি নেতৃস্থানীয় নয় এবং শীর্ষস্থানীয় স্থানগুলিও সরিয়ে দেয়।
রোল্যান্ড ইলিগ

বোধগম্যতা যদিও সত্যিই দুর্দান্ত। কমপক্ষে পাইথন 3 দিয়ে, temp = [line.rstrip() for line in file.readlines()]@ রোল্যান্ড_আইলিগ নোটগুলি কী বোঝায় তা পেতে কেউ ব্যবহার করতে পারে ।
bবলldave025

আপনি যদি সমস্ত লাইন ধরে পুনরাবৃত্তি করতে যাচ্ছেন, কেন এত অলসতা করবেন না? এর মাধ্যমে .readlines(), আপনি পুরো ফাইলটি দুবার কার্যকরভাবে পুনরাবৃত্তি করছেন।
এএমসি

1

এটা চেষ্টা কর:

u=open("url.txt","r")  
url=u.read().replace('\n','')  
print(url)  

4
যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। আপনার কোডটি ব্যাখ্যামূলক মন্তব্যে ভিড় না করার চেষ্টা করুন, কারণ এটি কোড এবং ব্যাখ্যা উভয়ের পাঠযোগ্যতা হ্রাস করে!
বিদায় স্ট্যাকএক্সচেঞ্জ

বিকল্প সমাধানগুলির মধ্যে কারও কেন এটি ব্যবহার করা উচিত তা আমি দেখছি না।
এএমসি

-1
my_file = open("first_file.txt", "r")
for line in my_file.readlines():
    if line[-1:] == "\n":
        print(line[:-1])
    else:
        print(line)
my_file.close() 

3
দয়া করে কিছু ব্যাখ্যা যুক্ত করুন যাতে এটি অন্যদের জন্য কার্যকর হয়।
সামুয়েলওয়েরেন্টজ

ফাইল অবজেক্টটি পরিচালনা করতে আপনার একটি প্রসঙ্গ পরিচালক ব্যবহার করা উচিত এবং সরাসরি ফাইলটি পুনরাবৃত্তি করতে হবে। এর .readlines()মতো ব্যবহার করে আপনি পুরো ফাইলটি দুবার কার্যকরভাবে পুনরাবৃত্তি করছেন।
এএমসি

-2
import csv

with open(filename) as f:
    csvreader = csv.reader(f)
    for line in csvreader:
         print(line[0])

2
তবে লাইনে যদি কমা থাকে তবে কী হবে?
গিল্চ

-8
def getText():
    file=open("ex1.txt","r");

    names=file.read().split("\n");
    for x,word in enumerate(names):
        if(len(word)>=20):
            return 0;
            print "length of ",word,"is over 20"
            break;
        if(x==20):
            return 0;
            break;
    else:
        return names;


def show(names):
    for word in names:
        len_set=len(set(word))
        print word," ",len_set


for i in range(1):

    names=getText();
    if(names!=0):
        show(names);
    else:
        break;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.