Python 使用Psycopg2执行复制到数据库后,文件对象为空

Python 使用Psycopg2执行复制到数据库后,文件对象为空,python,python-3.x,pandas,postgresql,psycopg2,Python,Python 3.x,Pandas,Postgresql,Psycopg2,在下面的示例中,执行“复制”\u expert命令后,文件内容似乎变为空,并且pd.read\u csv抛出一个错误,指出它是一个空文件。即使我以相反的顺序执行此操作(在复制之前读取\u csv),文件似乎也是空的。为什么文件是空的,我如何处理这种情况 file = //download file from S3 copy_sql = """ COPY %s FROM stdin WITH CSV HEADER

在下面的示例中,执行“复制”\u expert命令后,文件内容似乎变为空,并且pd.read\u csv抛出一个错误,指出它是一个空文件。即使我以相反的顺序执行此操作(在复制之前读取\u csv),文件似乎也是空的。为什么文件是空的,我如何处理这种情况

    file = //download file from S3

    copy_sql = """
                   COPY %s FROM stdin WITH CSV HEADER
                   DELIMITER as ','
                   """
    cursor = self.connection.cursor()
    cursor.copy_expert(sql=copy_sql % table_name, file=file)
    cursor.close()

   df = pd.read_csv(file, dtype={// dtype value})
编辑

我可以通过执行下面的操作来解决这个问题,但是了解文件对象被清空的原因以及是否有更有效的方法来实现这一点会很有帮助

    file = //download file from S3
    file_clone = copy.deepcopy(file)
    copy_sql = """
                   COPY %s FROM stdin WITH CSV HEADER
                   DELIMITER as ','
                   """
    cursor = self.connection.cursor()
    cursor.copy_expert(sql=copy_sql % table_name, file=file)
    cursor.close()

   df = pd.read_csv(file_clone, dtype={// dtype value})

问题是在第一次读取文件数据后,文件指针将位于文件的末尾;后续读取调用将不返回任何数据。
为了能够再次读取数据,您需要将指针移到文件的开头:

cursor.copy\u expert(sql=copy\u sql%table\u name,file=file)
file.seek(0)
df=pd.read\u csv(文件,dtype={//dtype value})