পাইথনে কোনও ফাইলের প্রথম এন লাইন পড়ুন


150

আমাদের কাছে একটি বৃহত কাঁচা ডেটা ফাইল রয়েছে যা আমরা একটি নির্দিষ্ট আকারে ট্রিম করতে চাই। আমি। নেট সি # তে অভিজ্ঞ, তবে জিনিসগুলি সহজলভ্য করতে এবং আগ্রহের বাইরে অজগরটিতে এটি করতে চাই।

পাইথনটিতে আমি কোনও টেক্সট ফাইলের প্রথম এন লাইন পেতে কীভাবে যাব? ওএস ব্যবহার হচ্ছে কি বাস্তবায়নে কোন প্রভাব ফেলবে?


আমি কি কমান্ড লাইন আর্গুমেন্ট হিসাবে এন দিতে পারি
নন

উত্তর:


240

পাইথন 2

with open("datafile") as myfile:
    head = [next(myfile) for x in xrange(N)]
print head

পাইথন ঘ

with open("datafile") as myfile:
    head = [next(myfile) for x in range(N)]
print(head)

এখানে আরও একটি উপায় রয়েছে (পাইথন 2 এবং 3 উভয়ই)

from itertools import islice
with open("datafile") as myfile:
    head = list(islice(myfile, N))
print head

1
ধন্যবাদ, এটি সত্যিই খুব সহায়ক। এই দুটির মধ্যে পার্থক্য কী? (পারফরম্যান্সের ক্ষেত্রে, প্রয়োজনীয় গ্রন্থাগার, সামঞ্জস্যতা ইত্যাদি)?
রাসেল

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

1
উইথ স্টেটমেন্টটি পাইথন ২.6 এ কাজ করে এবং 2.5 এর জন্য অতিরিক্ত আমদানির বিবৃতি প্রয়োজন। ২.৪ বা তারও আগের জন্য, আপনাকে ব্লক ব্যতীত ... চেষ্টা করে কোডটি পুনরায় লিখতে হবে। স্টাইলিস্টিকভাবে, আমি প্রথম বিকল্পটি পছন্দ করি, যদিও উল্লিখিত হিসাবে দ্বিতীয়টি সংক্ষিপ্ত ফাইলগুলির জন্য আরও দৃ rob়।
আলাসদায়ের

1
আইস্লিসটি সম্ভবত সিটিতে কার্যকর হওয়ার সাথে সাথে দ্রুত হয়
অ্যালিস পুরসেল

22
মনে রাখবেন যে ফাইলগুলি যদি কম থাকে তবে এন লাইনগুলি আপনার আটকাতে হবে স্টিপ ইন্টেরেশন ব্যতিক্রমটি উত্থাপন করবে
ইলিয়ান ইলিভ

19
N = 10
with open("file.txt", "a") as file:  # the a opens it in append mode
    for i in range(N):
        line = next(file).strip()
        print(line)

23
আমি যখনই f = open("file")ব্যতিক্রম ছাড়াই ফাইলটি বন্ধ করে দেখি তখনই আমি ক্রিঙ্ক করি । ফাইলগুলি হ্যান্ডেল করার পাইথোনিক উপায়টি একটি প্রসঙ্গ পরিচালক সহ, অর্থাত্ স্টেটমেন্ট সহ ব্যবহার করে। এটি ইনপুট আউটপুট পাইথন টিউটোরিয়ালে আচ্ছাদিত । "It is good practice to use the with keyword when dealing with file objects. This has the advantage that the file is properly closed after its suite finishes, even if an exception is raised on the way."
মার্ক মিকোফস্কি

1
ফাইলটি অ্যাপেন্ড মোডে খুলবেন কেন?
এএমসি

13

আপনি যদি প্রথম লাইনগুলি দ্রুত পড়তে চান এবং আপনি পারফরম্যান্সের বিষয়ে চিন্তা করেন না তবে আপনি .readlines()কোনটি রিটার্ন তালিকার অবজেক্টটি ব্যবহার করতে পারেন এবং তারপরে তালিকাটি কেটে ফেলতে পারেন।

প্রথম 5 লাইনের জন্য উদাহরণস্বরূপ:

with open("pathofmyfileandfileandname") as myfile:
    firstNlines=myfile.readlines()[0:5] #put here the interval you want

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

print firstNlines

একটি সুবিধা অন্য উত্তর তুলনায় সম্ভাবনা সহজে প্রথম 10 লাইন কুঁদন লাইন যেমন পরিসীমা নির্বাচন করা হয় [10:30]বা স্থায়ী হয় 10 [:-10]বা শুধুমাত্র এমনকি লাইন গ্রহণ [::2]


2
শীর্ষের উত্তরটি সম্ভবত আরও দক্ষ, তবে এটি ছোট ফাইলগুলির জন্য একটি কবজির মতো কাজ করে।
টি.চেমলেভস্কিজ

2
নোট করুন যে এটি প্রথমে পুরো ফাইলটি প্রথমে একটি তালিকায় পড়ে (মাইফাইল.ড্রেডলাইনস)) এবং তারপরে এটির প্রথম পাঁচটি লাইন স্প্লাইস করে।
AbdealiJK

2
এটি এড়ানো উচিত।
anilbey

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

প্রতিক্রিয়াটির জন্য @ এএমসি ধন্যবাদ, আমি যখন প্রথম লাইনে তাত্ক্ষণিকভাবে নজর রাখতে পারি তখন ডেটা অন্বেষণ করার জন্য কনসোলে এটি ব্যবহার করি, কোডটি লেখার ক্ষেত্রে এটি আমার সময় সাশ্রয় করে।
জিএম

9

আমি যা করি তা হ'ল এন লাইনগুলি কল করে pandas। আমি মনে করি পারফরম্যান্স সেরা নয়, তবে উদাহরণস্বরূপ N=1000:

import pandas as pd
yourfile = pd.read('path/to/your/file.csv',nrows=1000)

3
nrowsবিকল্পটি ব্যবহার করা আরও ভাল হবে যা 1000 এ সেট করা যেতে পারে এবং পুরো ফাইলটি লোড হয়নি। pandas.pydata.org/pandas-docs/stable/generated/… সাধারণত, পান্ডাদের কাছে এই বড় ফাইলগুলির জন্য এবং অন্যান্য মেমরির সংরক্ষণের কৌশল রয়েছে।
ফিল্মসেম

হ্যাঁ তুমিই ঠিক. আমি শুধু এটি সংশোধন। ভুলের জন্য দুঃখিত.
ক্রো-ম্যাগনন

1
আপনি sepএকটি কলাম ডিলিমিটার সংজ্ঞায়িত করতেও যোগ করতে পারেন (যা কোনও নন-
সিএসভি

1
@ ক্রো-ম্যাগন আমি pandas.read()নথিতে ফাংশনটি খুঁজে পাচ্ছি না , আপনি কি এই বিষয়ে কোনও তথ্য জানেন?
এএমসি

6

ফাইল অবজেক্টের দ্বারা প্রকাশিত লাইনের সংখ্যা পড়ার জন্য কোনও নির্দিষ্ট পদ্ধতি নেই।

আমি অনুমান করি যে সবচেয়ে সহজ উপায়টি অনুসরণ করা হবে:

lines =[]
with open(file_name) as f:
    lines.extend(f.readline() for i in xrange(N))

এটি এমন কিছু যা আমি আসলে চেয়েছিলাম। যদিও, আমি প্রতিটি লাইন তালিকার সাথে যুক্ত করছি। ধন্যবাদ.
আর্টডানিল

4

গিনিবলারের শীর্ষে ভোট দেওয়া উত্তরের উপর ভিত্তি করে (নভেম্বর 20 '09 at 0: 27): এই শ্রেণিটি অবজেক্ট ফাইল করার জন্য মাথা () এবং লেজ () পদ্ধতি যুক্ত করে।

class File(file):
    def head(self, lines_2find=1):
        self.seek(0)                            #Rewind file
        return [self.next() for x in xrange(lines_2find)]

    def tail(self, lines_2find=1):  
        self.seek(0, 2)                         #go to end of file
        bytes_in_file = self.tell()             
        lines_found, total_bytes_scanned = 0, 0
        while (lines_2find+1 > lines_found and
               bytes_in_file > total_bytes_scanned): 
            byte_block = min(1024, bytes_in_file-total_bytes_scanned)
            self.seek(-(byte_block+total_bytes_scanned), 2)
            total_bytes_scanned += byte_block
            lines_found += self.read(1024).count('\n')
        self.seek(-total_bytes_scanned, 2)
        line_list = list(self.readlines())
        return line_list[-lines_2find:]

ব্যবহার:

f = File('path/to/file', 'r')
f.head(3)
f.tail(3)

4

এটি করার দুটি অত্যন্ত স্বজ্ঞাত উপায় হ'ল:

  1. লাইন-বাই-লাইনে এবং লাইনের breakপরে ফাইলটিতে আইট্রেট করুন N

  2. next()পদ্ধতির Nসময়গুলি ব্যবহার করে লাইন-বাই-লাইন ফাইলটিতে আইট্রেট করুন । (শীর্ষস্থানীয় উত্তরটি যা করে তার জন্য এটি মূলত একটি আলাদা বাক্য গঠন))

কোডটি এখানে:

# Method 1:
with open("fileName", "r") as f:
    counter = 0
    for line in f:
        print line
        counter += 1
        if counter == N: break

# Method 2:
with open("fileName", "r") as f:
    for i in xrange(N):
        line = f.next()
        print line

নীচের লাইনটি যতক্ষণ না আপনি যতক্ষণ না পুরো ফাইলটিকে স্মৃতিতে ব্যবহার করেন না readlines()বা না ব্যবহার enumerateকরেন, আপনার কাছে প্রচুর বিকল্প রয়েছে।


3

আমার নিজের পক্ষে সবচেয়ে বিশ্বাসযোগ্য উপায়:

LINE_COUNT = 3
print [s for (i, s) in enumerate(open('test.txt')) if i < LINE_COUNT]

তালিকা বোঝার ভিত্তিতে সমাধান ফাংশনটি খোলার () একটি পুনরাবৃত্তি ইন্টারফেস সমর্থন করে। গণনা () উন্মুক্ত () এবং রিটার্ন টিউপসগুলি (সূচক, আইটেম) কভার করে, তারপরে আমরা পরীক্ষা করে দেখি যে আমরা কোনও স্বীকৃত পরিসরের মধ্যে রয়েছি (যদি আমি <LINE_COUNT) এবং তারপরে কেবল ফলাফল মুদ্রণ করা।

পাইথন উপভোগ করুন। ;)


এটি কেবল কিছুটা জটিল বিকল্প হিসাবে মনে হচ্ছে [next(file) for _ in range(LINE_COUNT)]
এএমসি

3

প্রথম 5 লাইনের জন্য, কেবল করুন:

N=5
with open("data_file", "r") as file:
    for i in range(N):
       print file.next()

2

আপনি যদি এমন কিছু চান যা স্পষ্টতই (ম্যানুয়ালগুলিতে রহস্যজনক জিনিসগুলি অনুসন্ধান না করে) আমদানি ছাড়াই কাজ করে এবং চেষ্টা করে / বাদে এবং পাইথন ২.x সংস্করণগুলির (2.2 থেকে 2.6) ন্যায্য পরিসরে কাজ করে:

def headn(file_name, n):
    """Like *x head -N command"""
    result = []
    nlines = 0
    assert n >= 1
    for line in open(file_name):
        result.append(line)
        nlines += 1
        if nlines >= n:
            break
    return result

if __name__ == "__main__":
    import sys
    rval = headn(sys.argv[1], int(sys.argv[2]))
    print rval
    print len(rval)

2

আপনার যদি সত্যিই বড় ফাইল থাকে এবং ধরে নিচ্ছেন যে আপনি আউটপুটটি একটি আঙ্কুল অ্যারে হিসাবে চান, np.genfromtxt ব্যবহার করা আপনার কম্পিউটারকে হিমশীতল করবে। এটি আমার অভিজ্ঞতায় আরও ভাল:

def load_big_file(fname,maxrows):
'''only works for well-formed text file of space-separated doubles'''

rows = []  # unknown number of lines, so use list

with open(fname) as f:
    j=0        
    for line in f:
        if j==maxrows:
            break
        else:
            line = [float(s) for s in line.split()]
            rows.append(np.array(line, dtype = np.double))
            j+=1
return np.vstack(rows)  # convert list of vectors to array

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

1

পাইথন ২.6 থেকে শুরু করে, আপনি আইও বেস ক্লসে আরও পরিশীলিত ফাংশনগুলির সুবিধা নিতে পারেন। সুতরাং উপরের উপরে রেট করা উত্তরগুলি এ হিসাবে আবারও লেখা যেতে পারে:

    with open("datafile") as myfile:
       head = myfile.readlines(N)
    print head

(আপনার স্টপ ইন্টেরেশন ব্যতিক্রম নষ্ট না হওয়ায় আপনার ফাইলটি এন লাইনের চেয়ে কম থাকবে বলে চিন্তা করার দরকার নেই don't)


25
ডক্স অনুসারে এন হ'ল পড়ার জন্য বাইট সংখ্যা, লাইনের সংখ্যা নয়
মার্ক মিকোফস্কি

4
এন বাইটের সংখ্যা!
কিয়েড

5
কি দারুন. দুর্বল নামকরণের বিষয়ে কথা বলুন। ফাংশন নাম উল্লেখ linesকিন্তু যুক্তি উল্লেখ করে bytes
আর্টঅফ ওয়ারফেয়ার

0

এটি আমার পক্ষে কাজ করেছে

f = open("history_export.csv", "r")
line= 5
for x in range(line):
    a = f.readline()
    print(a)

কনটেক্সট ম্যানেজার ব্যবহার করবেন না কেন? যাই হোক না কেন, বিদ্যমান বিদ্যমান উত্তরের উপর এটি কীভাবে উন্নতি করে তা আমি দেখতে পাচ্ছি না।
এএমসি


0

fname = input("Enter file name: ")
num_lines = 0

with open(fname, 'r') as f: #lines count
    for line in f:
        num_lines += 1

num_lines_input = int (input("Enter line numbers: "))

if num_lines_input <= num_lines:
    f = open(fname, "r")
    for x in range(num_lines_input):
        a = f.readline()
        print(a)

else:
    f = open(fname, "r")
    for x in range(num_lines_input):
        a = f.readline()
        print(a)
        print("Don't have", num_lines_input, " lines print as much as you can")


print("Total lines in the text",num_lines)

-1
#!/usr/bin/python

import subprocess

p = subprocess.Popen(["tail", "-n 3", "passlist"], stdout=subprocess.PIPE)

output, err = p.communicate()

print  output

এই পদ্ধতিটি আমার জন্য কাজ করেছিল


যদিও এটি আসলে পাইথন সমাধান নয়।
এএমসি

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