On Sep 11, 8:01 am, MRAB <[EMAIL PROTECTED]> wrote:
> On Sep 10, 6:59 pm, Sean Davis <[EMAIL PROTECTED]> wrote:
>
> > I have a large file that I would like to transform and then feed to a
> > function (psycopg2 copy_from) that expects a file-like object (needs
> > read and readline methods).
>
> > I have a class like so:
>
> > class GeneInfo():
> > def __init__(self):
> > #urllib.urlretrieve('ftp://ftp.ncbi.nih.gov/gene/DATA/
> > gene_info.gz',"/tmp/gene_info.gz")
> > self.fh = gzip.open("/tmp/gene_info.gz")
> > self.fh.readline() #deal with header line
>
> > def _read(self,n=1):
> > for line in self.fh:
> > if line=='':
> > break
> > line=line.strip()
> > line=re.sub("\t-","\t",line)
> > rowvals = line.split("\t")
> > yield "\t".join([rowvals[i] for i in
> > [0,1,2,3,6,7,8,9,10,11,12,14]]) + "\n"
>
> > def readline(self,n=1):
> > return self._read().next()
>
> > def read(self,n=1):
> > return self._read().next()
>
> Each time readline() and read() call self._read() they are creating a
> new generator. They then get one value from the newly-created
> generator and then discard that generator. What you should do is
> create the generator in __init__ and then use it in readline() and
> read().
>
>
>
> > def close(self):
> > self.fh.close()
>
> > and I use it like so:
>
> > a=GeneInfo()
> > cur.copy_from(a,"gene_info")
> > a.close()
>
> > It works well except that the end of file is not caught by copy_from.
> > I get errors like:
>
> > psycopg2.extensions.QueryCanceledError: COPY from stdin failed: error
> > during .read() call
> > CONTEXT: COPY gene_info, line 1000: ""
>
> > for a 1000 line test file. Any ideas what is going on?
>
> I wonder whether it's expecting readline() and read() to return an
> empty string at the end of the file instead of raising StopIteration.
Don't wonder; ReadTheFantasticManual:
read( [size])
... An empty string is returned when EOF is encountered
immediately. ...
readline( [size])
... An empty string is returned only when EOF is encountered
immediately.
--
http://mail.python.org/mailman/listinfo/python-list