2013-06-14 11 views
9

कुछ तरीकों यह करने के लिए:कुशलतापूर्वक पढ़ें पिछले 'एन' DataFrame में सीएसवी की पंक्तियों

  1. पूरे सीएसवी पढ़ें और फिर df.tail
  2. का उपयोग किसी भी तरह फ़ाइल रिवर्स (क्या सबसे अच्छा तरीका यह करने के लिए बड़ी फ़ाइलों के लिए?) और फिर nrows
  3. पढ़ने के लिए तर्क का उपयोग करें किसी भी तरह से CSV में पंक्तियों की संख्या पाएं, फिर skiprows का उपयोग करें और पंक्तियों की आवश्यक संख्या पढ़ें।
  4. शायद करते हिस्सा निकाल पढ़ें प्रारंभिक हिस्सा (हालांकि यकीन है कि यह कैसे काम करेगा नहीं)

यह कुछ आसान तरीके से किया जा सकता है? यदि नहीं, तो इन तीनों में से कौन सा पसंदीदा होना चाहिए और क्यों?

संभवतः संबंधित:

  1. Efficiently finding the last line in a text file
  2. Reading parts of ~13000 row CSV file with pandas read_csv and nrows

सीधे संबंधित नहीं:

  1. How to get the last n row of pandas dataframe?
+1

आप 'तलाश') और फिर पीछे की ओर जा सकते हैं। –

उत्तर

13

मैं पांडा नहीं लगता कि यह करने के लिए एक तरीका प्रदान करता read_csv में।

शायद neatest (एक पास में) का उपयोग करने के लिए है collections.deque:

from collections import deque 
from StringIO import StringIO 

with open(fname, 'r') as f: 
    q = deque(f, 2) # replace 2 with n (lines read at the end) 

In [12]: q 
Out[12]: deque(['7,8,9\n', '10,11,12'], maxlen=2) 
     # these are the last two lines of my csv 

In [13]: pd.read_csv(StringIO(''.join(q)), header=None) 

कोशिश कर रहा लायक एक अन्य विकल्प get the number of lines in a first pass है और उसके बाद, फिर से फ़ाइल को पढ़ने पंक्तियों की संख्या (ऋण एन) read_csv का उपयोग कर छोड़ ...

7

फ़ाइलें बाइट्स की बस स्ट्रीम हैं। रेखाएं अलग-अलग इकाइयों के रूप में मौजूद नहीं हैं; वे कुछ बाइट्स को न्यूलाइन अक्षरों के रूप में इलाज करने का एक आर्टिफैक्ट हैं। इस प्रकार, आप को क्रमशः लाइनों की पहचान करने के लिए फ़ाइल की शुरुआत से पढ़ना चाहिए।

अगर फ़ाइल नहीं बदली जाती है (अक्सर) और यह एक ऑपरेशन है जिसे आपको अक्सर प्रदर्शित करने की आवश्यकता होती है (कहें, n के विभिन्न मानों के साथ), आप दूसरी फ़ाइल में न्यूलाइन अक्षरों के बाइट ऑफ़सेट स्टोर कर सकते हैं। आप पहली फ़ाइल में किसी दिए गए लाइन पर त्वरित रूप से कूदने और वहां से पढ़ने के लिए इस बहुत छोटी फ़ाइल और seek कमांड का उपयोग कर सकते हैं।

(कुछ ऑपरेटिंग सिस्टम रिकॉर्ड उन्मुख फ़ाइलों आम फ्लैट फ़ाइल तुलना में अधिक जटिल आंतरिक संरचना है प्रदान करते हैं। इसके बाद के संस्करण उनके लिए लागू नहीं होता।)

1

यहां करने का एक आसान तरीका है। मुझे क्या करना पसंद है इसके लिए अच्छी तरह से काम करता है -

import tailer as tl 
import pandas as pd 
import io 
file = open(fname) 
lastLines = tl.tail(file,15) #to read last 15 lines, change it to any value. 
file.close() 
df=pd.read_csv(io.StringIO('\n'.join(lastLines)), header=None) 
संबंधित मुद्दे

 संबंधित मुद्दे