StringIO其代码中有以下注释:
Notes:
- Using a real file is often faster (but less convenient).
- There's also a much faster implementation in C, called cStringIO, but
it's not subclassable.
Run Code Online (Sandbox Code Playgroud)
“真实文件通常更快”这句话对我来说真的很奇怪:写入磁盘怎么能胜过写入内存呢?我尝试分析这些不同的案例,得到的结果与这些文档以及这个问题的答案相矛盾。这个另一个问题确实解释了为什么 cStringIO 在某些情况下速度较慢,尽管我在这里没有进行任何连接。该测试将给定量的数据写入文件,然后查找开头并将其读回。在“新”测试中,我每次都创建一个新对象,而在“相同”测试中,我会截断并为每次重复重用相同的对象,以排除开销来源。对于使用数据量较小但数据量较大的临时文件来说,这种开销很重要。
代码在这里。
Using 1000 passes with size 1.0KiB
New StringIO: 0.0026 0.0025 0.0034
Same StringIO: 0.0026 0.0023 0.0030
New cStringIO: 0.0009 0.0010 0.0008
Same cStringIO: 0.0009 0.0009 0.0009
New tempfile: 0.0679 0.0554 0.0542
Same tempfile: 0.0069 0.0064 0.0070
==============================================================
Using 1000 passes with …Run Code Online (Sandbox Code Playgroud) 我正在使用 python 2.7...
我正在尝试 cat 两个日志文件,使用 sed 从特定日期获取数据。需要压缩文件并将其上传到s3,而不在系统上创建任何临时文件,
sed_command = "sed -n '/{}/,/{}/p'".format(last_date, last_date)
Run Code Online (Sandbox Code Playgroud)
流动 :
示例:cat 文件1 文件2
我已经通过在系统上创建临时文件并在上传到 s3 完成后将其删除来成功完成此操作。我找不到一个可行的解决方案来使其在不创建任何临时文件的情况下运行。
我成功地将文件上传到谷歌存储,但我想跳过文件的创建并改用StringIO并直接在谷歌存储上创建文件。
由于我是 python 新手,我只是尝试使用我用于上传创建的文件的标准方法:
def cloud_upload(self, buffer, bucket, filename):
buffer.seek(0)
client = storage.Client()
bucket = client.get_bucket(bucket)
blob = bucket.blob(filename)
blob.upload_from_filename(buffer)
Run Code Online (Sandbox Code Playgroud)
但我收到错误:
类型错误:预期的字符串或缓冲区
但是既然我给了它 StringIO 对象,我不知道为什么这不起作用?
我收到了赛百味全天的详细销售、工人等收据,需要为管理课程提取数据。
我拍了收据的照片,然后用 pytesseract 将它们处理成由 \n 分隔的字符串,但现在不知道如何使用 pd.read_csv 和 StringIO 将其转换为数据帧。如果这是最好的方法,请不要这样做。也可能需要使用 cv2 编辑图像,以便更好地处理。
import numpy as np
import pytesseract
from PIL import Image
import pandas as pd
path = 'C:\\attachments\\'
monday = pytesseract.image_to_string(Image.open(path+'file1-1.jpeg'),lang='eng')
from StringIO import StringIO
mon = pd.read_csv(StringIO(monday),sep=r'\s',lineterminator=r'\n')
print(mon)
Run Code Online (Sandbox Code Playgroud)
这是当前星期一的一些变量。
"\nTIME HOURS :\nPERIOD SALES UNITS WORKED PROD SPLH\nZhan emmoo «Ct (iti ;:t‘«é‘«‘i CSD\n3A-4A $0.00 0 0 0 $0.00\n44-54 =: $0.00 SssOO 0 0 $0.00\n5A-6A $0.00 0 0 0 $0.00\nbA-7A $0.00 0 0 0 $0.00\n7A-BA =s«$0.00-Sss«OOs«*O0.80 0 $0.00\nBA-9A 60,00 . …Run Code Online (Sandbox Code Playgroud) import cStringIO
output = cStringIO.StringIO()
output.write('First line.\n')
print >>output, 'Second line.'
# Retrieve file contents -- this will be
# 'First line.\nSecond line.\n'
contents = output.getvalue()
Run Code Online (Sandbox Code Playgroud)
第5行>>output的print声明中有什么作用?
所以,我在网上尝试了一些解决方案,但每个都返回一个不同的错误.最近我决定尝试这样的事情:
import cStringIO, pygame, os
from pygame.locals import *
pygame.init()
mainClock = pygame.time.Clock()
WINDOWWIDTH = 640
WINDOWHEIGHT = 480
windowSurface = pygame.display.set_mode((WINDOWWIDTH, WINDOWHEIGHT), 0, 32)
pygame.display.set_caption('StringIO Test')
with open("image.png", "rb") as infile:
outfile = cStringIO.StringIO()
outfile.write(infile.read())
class DummyFile:
def __init__(self, data):
self.data = data
self.pos = 0
def read(self, size=None):
start = self.pos
end = len(self.data) - 1
if size is not None:
end = min(len(self.data), self.pos + size)
self.pos = end
return self.data[start:end]
def seek(self, offset, whence=0):
if whence …Run Code Online (Sandbox Code Playgroud) 我正在运行以下脚本,以便在文件存在的情况下通过循环数月和数年来相互追加文件,我刚刚用更大的数据集测试它,我希望输出文件的大小约为600mb.但是我遇到了内存问题.首先是这是正常的遇到内存问题(我的电脑有8 GB RAM)我不知道我是如何吃掉所有这些内存空间的?
import datetime, os
import StringIO
stored_data = StringIO.StringIO()
start_year = "2011"
start_month = "November"
first_run = False
current_month = datetime.date.today().replace(day=1)
possible_month = datetime.datetime.strptime('%s %s' % (start_month, start_year), '%B %Y').date()
while possible_month <= current_month:
csv_filename = possible_month.strftime('%B %Y') + ' MRG.csv'
if os.path.exists(csv_filename):
with open(csv_filename, 'rb') as current_csv:
if first_run != False:
next(current_csv)
else:
first_run = True
stored_data.writelines(current_csv)
possible_month = (possible_month + datetime.timedelta(days=31)).replace(day=1)
if stored_data:
contents = stored_data.getvalue()
with open('FullMergedData.csv', 'wb') as output_csv:
output_csv.write(contents)
Run Code Online (Sandbox Code Playgroud)
Traceback (most …Run Code Online (Sandbox Code Playgroud) 我正在尝试重构python 2包以与python-3.x一起使用.该包使用StringIO.StringIOpython 2,并使用对象的相对搜索方法,语句如flob.seek(-1, 1).不幸的是,python 3中seek相应io.StringIO对象的方法不支持相对搜索,因此代码提出
OSError: Can't do nonzero cur-relative seeks
Run Code Online (Sandbox Code Playgroud)
在尝试执行该语句时.
重构包含这些调用的模块的最佳方法是什么,因为我希望能够继续使用此文件对象以及(从中派生的对象)出现的函数?
嘿,我试图将这个小片段从2端口移植到Python 3.
Python 2:
def _download_database(self, url):
try:
with closing(urllib.urlopen(url)) as u:
return StringIO(u.read())
except IOError:
self.__show_exception(sys.exc_info())
return None
Run Code Online (Sandbox Code Playgroud)
Python 3:
def _download_database(self, url):
try:
with closing(urllib.request.urlopen(url)) as u:
response = u.read().decode('utf-8')
return StringIO(response)
except IOError:
self.__show_exception(sys.exc_info())
return None
Run Code Online (Sandbox Code Playgroud)
但我还是得到了
utf-8 codec can't decode byte 0x8f in position 12: invalid start byte
Run Code Online (Sandbox Code Playgroud)
我需要使用StringIO,因为它是一个zipfile,我想用该函数解析它:
def _parse_zip(self, raw_zip):
try:
zip = zipfile.ZipFile(raw_zip)
filelist = map(lambda x: x.filename, zip.filelist)
db_file = 'IpToCountry.csv' if 'IpToCountry.csv' in filelist else filelist[0]
with closing(StringIO(zip.read(db_file))) as raw_database:
return_val …Run Code Online (Sandbox Code Playgroud) 我写了一个python软件包,设法使它与python 2.7和python 3.4完全兼容,但到目前为止,有一个例外使我感到困惑。该软件包包括一个命令行脚本,在我的单元测试中,我使用此代码运行脚本的主例程,同时覆盖sys.argv以传递argparse的命令行参数,并捕获脚本的stdout进行比较:
@contextlib.contextmanager
def runmain(mainfunction, arglist):
"""Run mainfunction with arglist in sys.srgv, and capture stdout."""
origargv, sys.argv = sys.argv, arglist
origout, sys.stdout = sys.stdout, io.StringIO()
rtn = mainfunction()
sys.stdout.seek(0)
yield (rtn, sys.stdout.read())
sys.stdout = origout
sys.argv = origargv
class test_imdutil_main(unittest.TestCase):
def test_help(self):
"""Test -h option."""
with runmain(imdutil_main, ['imdutil.py', '-h']) as (rtn, capture):
# do stuff with rtn and capture...
Run Code Online (Sandbox Code Playgroud)
这在python 3.4中很好用,但是在python 2.7中会产生错误:
TypeError: unicode argument expected, got 'str'
Run Code Online (Sandbox Code Playgroud)
我还没有想出一种从任意函数捕获stdout的方法,该函数可以在python 2.7和python 3.4之间移植。
顺便说一句,我必须承认我完全不太了解装饰,上下文管理器或“ yield”关键字。我的runmain()函数的灵感来自:
http://schinckel.net/2013/04/15/capture-and-test-sys.stdout-sys.stderr-in-unittest.testcase/
顺便说一句,我的完整程序包来自以下代码:
https://github.com/NF6X/pyImageDisk
目前,由于这个问题,其单元测试在python 2.7下已部分中断。有人可以帮助我找出如何以可移植的Python方式解决此stdout重定向问题的方法,最好不要添加任何其他外部依赖项吗?
stringio ×10
python ×7
python-2.7 ×2
python-3.x ×2
boto ×1
buffer ×1
cstringio ×1
gzip ×1
image ×1
memory ×1
pandas ×1
performance ×1
printing ×1
pygame ×1
pytesser ×1
python-2.x ×1
python-3.4 ×1
sed ×1
stdout ×1
urllib ×1