On 2016-10-02 06:33, Sayth Renshaw wrote:
On Sunday, 2 October 2016 16:19:14 UTC+11, Sayth Renshaw wrote:
On Sunday, 2 October 2016 12:14:43 UTC+11, MRAB wrote:
> On 2016-10-02 01:21, Sayth Renshaw wrote:
> > Hi
> >
> > I have a fileobject which was fine however now I want to delete a line from
the file object before yielding.
> >
> > def return_files(file_list):
> > for filename in sorted(file_list):
>
> When joining paths together, it's better to use 'os.path.join'.
>
> > with open(dir_path + filename) as fd:
> > for fileItem in fd:
> > yield fileItem
> >
> > Ned gave an answer over here http://stackoverflow.com/a/6985814/461887
> >
> > for i, line in enumerate(input_file):
> > if i == 0 or not line.startswith('#'):
> > output.write(line)
> >
> > which I would change because it is the first line and I want to rid <!--
> >
> > for i, line in enumerate(input_file):
> > if line.startswith(<!--'):
> > output.write(line)
> >
> > However I do not want to write the file I want to restore all the
enumerated files back to the fileItem I need to yield.
> >
> > How do I do this?
> >
> You use the logic of the answer from StackOverflow in your
> 'return_files' function:
>
> def return_files(file_list):
> for filename in sorted(file_list):
> with open(dir_path + filename) as fd:
> for fileItem in fd:
> if keep_item(fileItem):
> yield fileItem
>
>
> If you need to know the line number when deciding whether to keep a
> line, use enumerate too:
>
> def return_files(file_list):
> for filename in sorted(file_list):
> with open(dir_path + filename) as fd:
> for i, fileItem in enumerate(fd):
> if keep_item(fileItem, i):
> yield fileItem
I just can't quite get it.
def return_files(file_list):
for filename in sorted(file_list):
file = os.path.join(dir_path, filename)
print(file)
with open(file) as fd:
print(fd)
for fileItem in fd:
print(fileItem)
for line in fileItem:
print(line[0])
if line.startswith('<!--'):
print(line[1:])
yield line[1:]
else:
yield line[:]
I maybe over baking it but just not getting it right.
Sayth
Aargh, half solved it, now it works except I am creating a list as the yielded
item and lxml doesn't accept list it wants the file.
def return_files(file_list):
"""
Take a list of files and return file when called.
Calling function to supply attributes
"""
for filename in sorted(file_list):
file = os.path.join(dir_path, filename)
with open(file, 'r') as fd:
data = fd.read().splitlines(True)
if data[0].startswith('<!--'):
print(data[1:])
yield data[1:]
else:
yield data[0:]
A shorter way of reading the lines is:
lines = fd.readlines()
You can yield the lines one at a time with:
yield from lines
This is equivalent to:
for line in lines:
yield line
but is shorter, quicker and doesn't use a variable!
--
https://mail.python.org/mailman/listinfo/python-list