मुझे सलाह है कि आपदेखते समय पूरी लाइन को अनदेखा न करेंचरित्र; बस बाकी रेखा को अनदेखा करें। विभाजन स्ट्रिंग, विभाजन स्ट्रिंग, और विभाजन स्ट्रिंग के बाद सब कुछ पहले सब कुछ: आप partition
नामक एक स्ट्रिंग विधि समारोह के साथ आसानी से ऐसा कर सकते हैं:
with open("filename") as f:
for line in f:
line = line.partition('#')[0]
line = line.rstrip()
# ... do something with line ...
partition
एक टपल देता है। तो, [0]
के साथ अनुक्रमण करके हम विभाजन स्ट्रिंग से पहले भाग लेते हैं।
संपादित करें: आप, यहाँ कि partition()
नहीं है अजगर का एक संस्करण का उपयोग कर रहे हैं, तो आप इस्तेमाल कर सकते हैं कोड है:
with open("filename") as f:
for line in f:
line = line.split('#', 1)[0]
line = line.rstrip()
# ... do something with line ...
यह एक '#' चरित्र पर स्ट्रिंग विभाजन है, तो सब कुछ रहता है विभाजन से पहले। 1
तर्क एक विभाजन के बाद .split()
विधि स्टॉप बनाता है; चूंकि हम 0 वें सबस्ट्रिंग को पकड़ रहे हैं ([0]
के साथ अनुक्रमणित करके) आपको 1
तर्क के बिना एक ही जवाब मिल जाएगा, लेकिन यह थोड़ा तेज़ हो सकता है। (मेरे मूल कोड से सरलीकृत @gnr से एक टिप्पणी के लिए धन्यवाद। मेरा मूल कोड कोई अच्छा कारण नहीं था; धन्यवाद, @gnr।)
आप अपने partition()
का अपना संस्करण भी लिख सकते हैं। यहाँ एक part()
कहा जाता है:
def part(s, s_part):
i0 = s.find(s_part)
i1 = i0 + len(s_part)
return (s[:i0], s[i0:i1], s[i1:])
@dalle ने कहा कि '#' एक स्ट्रिंग के अंदर दिखाई दे सकता है। इस मामले को सही तरीके से संभालना इतना आसान नहीं है, इसलिए मैंने इसे अनदेखा किया, लेकिन मुझे कुछ कहना चाहिए था।
यदि आपकी इनपुट फ़ाइल में उद्धृत तारों के लिए पर्याप्त नियम हैं, तो यह मुश्किल नहीं है। यदि आप किसी भी कानूनी पायथन उद्धृत स्ट्रिंग को स्वीकार करते हैं तो यह कठिन होगा, क्योंकि एकल-उद्धृत, डबल-उद्धृत, मल्टीलाइन उद्धरण हैं जो बैकस्लैश के अंत में लाइन से बचते हैं, ट्रिपल उद्धृत तार (या तो सिंगल या डबल कोट्स का उपयोग करके), और कच्चे तार भी! एक जटिल राज्य मशीन होगी जो सही ढंग से सभी को संभालने का एकमात्र संभावित तरीका है।
लेकिन अगर हम खुद को केवल एक साधारण उद्धृत स्ट्रिंग तक सीमित करते हैं, तो हम इसे एक साधारण राज्य मशीन से संभाल सकते हैं। हम स्ट्रिंग के अंदर बैकस्लैश-उद्धृत डबल कोट भी अनुमति दे सकते हैं।
c_backslash = '\\'
c_dquote = '"'
c_comment = '#'
def chop_comment(line):
# a little state machine with two state varaibles:
in_quote = False # whether we are in a quoted string right now
backslash_escape = False # true if we just saw a backslash
for i, ch in enumerate(line):
if not in_quote and ch == c_comment:
# not in a quote, saw a '#', it's a comment. Chop it and return!
return line[:i]
elif backslash_escape:
# we must have just seen a backslash; reset that flag and continue
backslash_escape = False
elif in_quote and ch == c_backslash:
# we are in a quote and we see a backslash; escape next char
backslash_escape = True
elif ch == c_dquote:
in_quote = not in_quote
return line
मैं वास्तव में इस एक सवाल में चिह्नित "शुरुआत" में जटिल हो नहीं करना चाहता था, लेकिन इस राज्य मशीन यथोचित आसान है, और मुझे आशा है कि यह दिलचस्प होगा।एक फ़िल्टर अभिव्यक्ति की
हां। नोटिस के लिए धन्यवाद। – ghostdog74
... अग्रणी व्हाइटस्पेस को अनदेखा करते समय: 'if not line.strip()। Startwith ("#") ' – exhuma
आपके कोड में' खुले फ़ाइल" के लिए लाइन है: 'जो एक खुली फ़ाइल हैंडल छोड़ देता है। आपको 'ओपन ("फाइल") का रिटर्न वैल्यू रखना चाहिए और जब आप पूरा कर लें तो स्पष्ट रूप से' क्लोज़() 'पर कॉल करें, या' with' स्टेटमेंट 'का उपयोग करें (http://docs.python.org/ देखें पुस्तकालय/stdtypes.html # file.close)। –