我有一个python测试,我想测试日志记录是否正常工作.例如,我有一个创建用户的函数,最后日志记录将响应写入日志文件.
logger = logging.getLogger('mylogger')
logger.setLevel(logging.DEBUG)
handler = logging.handlers.WatchedFileHandler('mylogfile.log')
formatter = logging.Formatter('%(asctime)s: %(message)s',
'%d/%b/%Y:%H:%M:%S %z')
handler.setFormatter(formatter)
logger.addHandler(handler)
logger.info('Some log text')
Run Code Online (Sandbox Code Playgroud)
在我的测试用例中,我想将日志输出发送到StringIO.
class MyTest(unittest.TestCase):
def setUp(self):
stream = StringIO()
self.handler = logging.StreamHandler(stream)
log = logging.getLogger('mylogger')
log.removeHandler(log.handlers[0])
log.addHandler(self.handler)
def tearDown(self):
log = logging.getLogger('mylogger')
log.removeHandler(self.handler)
self.handler.close()
Run Code Online (Sandbox Code Playgroud)
问题是,我不确定我应该如何测试我的记录器是否正常工作.
如何将内存zipfile写入文件?
# Create in memory zip and add files
zf = zipfile.ZipFile(StringIO.StringIO(), mode='w',compression=zipfile.ZIP_DEFLATED)
zf.writestr('file1.txt', "hi")
zf.writestr('file2.txt', "hi")
# Need to write it out
f = file("C:/path/my_zip.zip", "w")
f.write(zf) # what to do here? Also tried f.write(zf.read())
f.close()
zf.close()
Run Code Online (Sandbox Code Playgroud) 假设我有一个类似StringIO文件的对象,我只是从字符串创建的.我把它传递给一个需要文件的函数.此函数通过结尾读取整个文件.我现在想把它传递给另一个需要类文件对象的函数.我可以回放它以便从头开始阅读吗?如果没有,我可以采取哪些其他方法来实现最蟒蛇般的方法?
我正在将ebay sdk移植到python3,我偶然发现了以下问题.
我正在使用pycurl发送一些HTTP请求.这是我配置它的方式:
self._curl = pycurl.Curl()
self._curl.setopt(pycurl.FOLLOWLOCATION, 1)
self._curl.setopt(pycurl.URL, str(request_url))
self._curl.setopt(pycurl.SSL_VERIFYPEER, 0)
self._response_header = io.StringIO()
self._response_body = io.StringIO()
self._curl.setopt(pycurl.CONNECTTIMEOUT, self.timeout)
self._curl.setopt(pycurl.TIMEOUT, self.timeout)
self._curl.setopt(pycurl.HEADERFUNCTION, self._response_header.write)
self._curl.setopt(pycurl.WRITEFUNCTION, self._response_body.write)
Run Code Online (Sandbox Code Playgroud)
当我调用self._curl.perform()时,我收到以下错误:
pycurl.error: (23, 'Failed writing body (1457 != 1460)')
Run Code Online (Sandbox Code Playgroud)
据我所知,这意味着写函数存在问题,但我无法弄清楚究竟是什么.可能与从StringIO模块迁移到io有关,但我不确定.
UPD:我尝试过以下方法:
def body(buf):
self._response_body.write(buf)
def header(buf):
self._response_header.write(buf)
self._curl.setopt(pycurl.HEADERFUNCTION, header)
self._curl.setopt(pycurl.WRITEFUNCTION, body)
Run Code Online (Sandbox Code Playgroud)
它的工作原理.我试图用lambdas做同样的技巧(而不是定义那些笨拙的功能,但它没有用.
我已经通过看这些文档和谷歌,似乎无法找到的目的.rewind,以及它如何从不同.close,在工作的环境Tempfile.
另外,为什么.read在倒带之前返回一个空字符串?
这是一个例子:
file = Tempfile.new('foo')
file.path # => A unique filename in the OS's temp directory,
# e.g.: "/tmp/foo.24722.0"
# This filename contains 'foo' in its basename.
file.write("hello world")
file.rewind
file.read # => "hello world"
file.close
file.unlink # deletes the temp file
Run Code Online (Sandbox Code Playgroud) 所以我有一个StringIO()类似文件的对象,我正在尝试将其写入a ZipFile(),但是我得到了这个TypeError:
coercing to Unicode: need string or buffer, cStringIO.StringI found
Run Code Online (Sandbox Code Playgroud)
以下是我正在使用的代码示例:
file_like = StringIO()
archive = zipfile.ZipFile(file_like, 'w', zipfile.ZIP_DEFLATED)
# my_file is a StringIO object returned by a remote file storage server.
archive.write(my_file)
Run Code Online (Sandbox Code Playgroud)
文档说这StringIO()是一个类文件类,ZipFile()可以接受类文件对象.有什么我想念的吗?任何帮助将不胜感激.
提前致谢!
我可以将StringIO对象传递给pd.to_csv()就好了:
io = StringIO.StringIO()
pd.DataFrame().to_csv(io)
Run Code Online (Sandbox Code Playgroud)
但是当使用excel编写器时,我遇到了很多麻烦.
io = StringIO.StringIO()
writer = pd.ExcelWriter(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save()
Run Code Online (Sandbox Code Playgroud)
返回一个
AttributeError: StringIO instance has no attribute 'rfind'
Run Code Online (Sandbox Code Playgroud)
我正在尝试创建一个ExcelWriter没有调用的对象pd.ExcelWriter()但是遇到了一些麻烦.这是我到目前为止所尝试的:
from xlsxwriter.workbook import Workbook
writer = Workbook(io)
pd.DataFrame().to_excel(writer,"sheet name")
writer.save()
Run Code Online (Sandbox Code Playgroud)
但现在我得到了一个 AttributeError: 'Workbook' object has no attribute 'write_cells'
如何将excel格式的pandas数据帧保存到StringIO对象?
我需要循环,直到我到达类似文件的对象的末尾,但我没有找到"明显的方法去做",这让我怀疑我忽略了一些东西,很明显.:-)
我有一个流(在这种情况下,它是一个StringIO对象,但我也对一般情况感到好奇)以"<length> <data>"格式存储未知数量的记录,例如:
data = StringIO("\x07\x00\x00\x00foobar\x00\x04\x00\x00\x00baz\x00")
Run Code Online (Sandbox Code Playgroud)
现在,我能想象的唯一清晰的方法就是使用(我认为是)一个初始化的循环,这看起来有点像非Pythonic:
len_name = data.read(4)
while len_name != "":
len_name = struct.unpack("<I", len_name)[0]
names.append(data.read(len_name))
len_name = data.read(4)
Run Code Online (Sandbox Code Playgroud)
在一个类似C语言,我只是坚持的read(4)中while的测试条款,但当然不会对Python的工作.有没有想过更好的方法来实现这个目标?
我正在使用一个io.StringIO对象来模拟一个类的单元测试中的文件.问题是这个类似乎希望默认情况下所有字符串都是unicode,但内置str函数不会返回unicode字符串:
>>> buffer = io.StringIO()
>>> buffer.write(str((1, 2)))
TypeError: can't write str to text stream
Run Code Online (Sandbox Code Playgroud)
但
>>> buffer.write(str((1, 2)) + u"")
6
Run Code Online (Sandbox Code Playgroud)
作品.我假设这是因为与unicode字符串的串联也会使结果成为unicode.这个问题有更优雅的解决方案吗?
我正在使用pandas来管理大量的8字节整数.这些整数作为空格分隔的元素包含在逗号分隔的CSV文件中,并且数组大小约为10000x10000.
Pandas能够快速读取前几列中逗号分隔的数据作为DataFrame,并且还可以轻松地将空格分隔的字符串存储在另一个DataFrame中.当我尝试将表从一列空格分隔的字符串转换为8位整数的DataFrame时,就会遇到麻烦.
我尝试过以下方法:
intdata = pd.DataFrame(strdata.columnname.str.split().tolist(), dtype='uint8')
Run Code Online (Sandbox Code Playgroud)
但内存使用情况令人难以忍受 - 价值10MB的整数消耗2GB内存.我被告知这是语言的限制,在这种情况下我无能为力.
作为一种可能的解决方法,我被建议将字符串数据保存为CSV文件,然后将CSV文件重新加载为以空格分隔的整数的DataFrame.这很好用,但为了避免写入磁盘的速度减慢,我尝试写一个StringIO对象.
这是一个最小的非工作示例:
import numpy as np
import pandas as pd
from cStringIO import StringIO
a = np.random.randint(0,256,(10000,10000)).astype('uint8')
b = pd.DataFrame(a)
c = StringIO()
b.to_csv(c, delimiter=' ', header=False, index=False)
d = pd.io.parsers.read_csv(c, delimiter=' ', header=None, dtype='uint8')
Run Code Online (Sandbox Code Playgroud)
这会产生以下错误消息:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 443, in parser_f
return _read(filepath_or_buffer, kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 228, in _read
parser = TextFileReader(filepath_or_buffer, **kwds)
File "/usr/lib64/python2.7/site-packages/pandas/io/parsers.py", line 533, …Run Code Online (Sandbox Code Playgroud)