天道酬勤,学无止境

Python - Writing Separate Files per Section of a Single File

问题
from itertools import cycle

filename = raw_input("Which file?: \n")

dimensionsList = ["Section 1", "Section 2",
    "Section 3", "Section 4", "Section 5"]

with open(filename+".txt", "rb") as oldfile:
    for i in dimensionsList:
        licycle = cycle(dimensionsList)
        nextelem = licycle.next()
        with open(i+".txt", "w") as newfile: 
            for line in oldfile:
                if line.strip() == i:
                    break
            for line in oldfile:
                if line.strip() == nextelem:
                    break
                newfile.write(line)
回答1

问题

测试您的代码,它仅适用于第 1 部分(其他部分对我来说也是空白的)。 我意识到问题是部分之间的转换(而且, licycle在所有迭代中都重新启动)。

第 2 节在第二for读取( if line.strip() == nextelem )。 下一行是 Section 2 的数据(而不是文本Section 2 )。

文字很难,但测试下面的代码:

from itertools import cycle

filename = raw_input("Which file?: \n")

dimensionsList = ["Section 1", "Section 2", "Section 3", "Section 4",
                  "Section 5"]

with open(filename + ".txt", "rb") as oldfile:
    licycle = cycle(dimensionsList)
    nextelem = licycle.next()
    for i in dimensionsList:
        print(nextelem)
        with open(i + ".txt", "w") as newfile:
            for line in oldfile:
                print("ignoring %s" % (line.strip()))
                if line.strip() == i:
                    nextelem = licycle.next()
                    break
            for line in oldfile:
                if line.strip() == nextelem:
                    # nextelem = licycle.next()
                    print("ignoring %s" % (line.strip()))
                    break
                print("printing %s" % (line.strip()))
                newfile.write(line)
            print('')

它将打印:

Section 1
ignoring Section 1
printing aaaa
printing bbbb
ignoring Section 2

Section 2
ignoring ccc
ignoring ddd
ignoring Section 3
ignoring eee
ignoring fff
ignoring Section 4
ignoring ggg
ignoring hhh
ignoring Section 5
ignoring iii
ignoring jjj

Section 2

Section 2

Section 2

它适用于第 1 节,它检测到第 2 节,但它一直忽略这些行,因为它没有找到“第 2 节”。

如果每次重新启动线路(总是从第 1 行开始),我认为该程序会起作用。 但我制作了一个更简单的代码,应该对你有用。

解决方案

from itertools import cycle

filename = raw_input("Which file?: \n")

dimensionsList = ["Section 1", "Section 2", "Section 3", "Section 4",
                  "Section 5"]

with open(filename + ".txt", "rb") as oldfile:

    licycle = cycle(dimensionsList)
    nextelem = licycle.next()
    newfile = None
    line = oldfile.readline()

    while line:

        # Case 1: Found new section
        if line.strip() == nextelem:
            if newfile is not None:
                newfile.close()
            nextelem = licycle.next()
            newfile = open(line.strip() + '.txt', 'w')

        # Case 2: Print line to current section
        elif newfile is not None:
            newfile.write(line)

        line = oldfile.readline()

如果它找到该部分,它将开始在这个新文件中写入。 否则,继续写入当前文件。

Ps.:下面,我使用的文件作为示例:

Section 1
aaaa
bbbb
Section 2
ccc
ddd
Section 3
eee
fff
Section 4
ggg
hhh
Section 5
iii
jjj

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Python - Writing Separate Files per Section of a Single File
    I have a .txt file with 5 sections of data. Each section has a header line "Section X". I would like to parse and write 5 separate files from this single file. The section would start at the header and end before the next section header. The code below create 5 separate files; however, they are all blank. from itertools import cycle filename = raw_input("Which file?: \n") dimensionsList = ["Section 1", "Section 2", "Section 3", "Section 4", "Section 5"] with open(filename+".txt", "rb") as oldfile: for i in dimensionsList: licycle = cycle(dimensionsList) nextelem = licycle.next() with open(i+"
  • 组织MATLAB类的最佳方法? [关闭](Best way to organize MATLAB classes? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 5年前关闭。 改善这个问题 MATLAB有两种组织类的方式: @-目录: @ClassName\ ClassName.m Method1.m Method2.m 单个文件: ClassName.m: classdef ClassName methods % all methods included here end end 第一种样式在新的classdef语法之前存在,但似乎是一种更结构化的处理方式。 第二种样式(所有内容都在一个文件中)是新样式。 您使用哪种方法,为什么? 回答1 新的单文件样式具有一些优点。 它允许并鼓励您编写许多小的方法,我认为这些方法会导致代码分解的更好。 创建新文件,保存文件并将其添加到源代码管理(我们都在使用源代码管理,对吗?)的麻烦很小,但是添加了数十种小方法就足以使我通常不愿考虑使用分类为更细粒度的功能。 编辑整个类很方便进行浏览,搜索和替换,而不必打开多个单独的编辑器选项卡,然后可以使用这些选项卡来组织不同类的源代码。 对于较大的代码库,单文件样式可能会有性能上的优势。 遍历源代码树的源代码控制和部署系统为stat和diff操作之类的文件收取每个文件的费用。 例如,对于较大的代码库,数千种方法可能非常重要
  • Behat 中外部文件中的步骤定义(Step definitions in external files in Behat)
    问题 Behat 默认在名为FeatureContext文件中查找步骤定义(所有步骤都在一个文件中)。 步骤很多,维护这么大的文件很难。 我希望每个功能文件有一个定义文件。 如何在外部文件中有步骤定义? 例如 homepage.feature HomepageContext extends FeatureContext 回答1 Behat 有多个选项供您将 FeatureContext 拆分为多个类。 首先,您可以使用老式的 php5 继承。 如果继承不是你想要的,Behat 还支持子上下文:“使用子上下文”。 接下来,如果您想以不同于FeatureContext方式命名您的类,您可以在您的behat.yml配置文件的“上下文配置”部分重新定义它。 通过这种方式,您可以将公共定义和挂钩拆分为单独的类,并在其他功能套件中使用它们以及通过子上下文或继承。 但你的问题也问: 我希望每个功能文件有一个定义文件。 这个要求是完全错误的。 Behat 和 Scenario BDD 都是关于用业务术语描述您的应用程序行为并为所描述的行为创建测试字典。 记住这一点,从逻辑上讲,一个功能集不能有多个不同的词典。 通过编写步骤定义,您可以告诉 Behat Given I am on "/news"含义。 当您希望该步骤在不同功能之间具有不同的含义时,您就做错了。 Behat 由 2
  • App Engine:大型脚本或小型脚本很少?(App Engine: Few big scripts or many small ones?)
    问题 我正在要在App Engine上托管的网站上工作。 我的App Engine脚本是用Python编写的。 现在,假设您可以在我的网站上注册并拥有用户个人资料。 现在,用户配置文件种类繁多,并具有5​​0多个不同的ndb属性(仅出于示例目的)。 如果用户想要编辑他的记录(可以扩展某些记录),则可以通过我的网站进行操作,以向App Engine后端发送请求。 配置文件是截面的方式,通常约有5到10个属性落入页面的小部分或容器中。 在服务器端,我将有多个小脚本来处理整个Profile的一小部分。 例如,一个脚本将更新“地址信息”,另一个将更新“兴趣”和“关于我”文本。 这样,我最终得到了5个左右的脚本。 优点是每个脚本都易于维护,并且只做一件特定的事情。 但是我不知道这样的事情是否明智。 因为如果我在页面的其余部分保持这种习惯,我可能最终会遇到大约100个或更多不同的.py脚本和一个很大的app.yaml,而且我不知道它们在Google服务器上的缓存效率如何。 所以tl; dr: 是否有许多小型后端脚本在我的App Engine后端上执行小任务是一个好主意,还是我应该使用少数可以处理各种不同任务的脚本? 回答1 每当您的应用实例启动时,都必须加载一个大脚本,这可能会损害实例启动时间,启动实例的每个请求的响应时间以及实例的内存占用。 但是它可以立即处理任何请求,无需加载其他代码。
  • 将 App.config 应用到我的 DLL 程序集?(Apply an App.config to my DLL assembly?)
    问题 我正在编写一个类库作为抽象,用于登录我编写的任何应用程序、服务等。 我通过使其非常可配置来满足我遇到的大多数应用程序/服务日志记录场景的需求,从而使其非常健壮。 该配置旨在指定以下内容: 写什么日志级别写入所有级别的一个日志文件写入每个级别的单独文件记录截止(定期、应用事件、字节大小受限) 日志文件过期(文件过期后删除日志文件) 写为纯文本或 XML 日志文件名格式规范是否在文件名前加上日期父应用的名称等等等等等等... 我已经阅读了一些关于 DLL 程序集配置的其他 stackoverflow 问题,它导致托管程序集/应用程序的 app.config 之间发生冲突。 我相信我的程序集有理由提供一个配置文件。 这是那个场合的好场景吗? 将我自己的配置烘焙到我的项目中以便我的记录器从 XML 文件中读取以检索配置值可能是一个更好的主意吗? 回答1 你能做的是 创建自定义配置部分(例如使用配置部分设计器工具) 将程序集的配置放入单独的MyAssembly.config文件中从主机应用程序的配置中引用该程序集配置文件: <configuration> <configSections> <section name="YourAssembly" type="YourAssembly.ConfigSection, YourAssembly" /> </configSections>
  • 解决方案中的文件夹是否应该与命名空间匹配?(Should the folders in a solution match the namespace?)
    问题 解决方案中的文件夹是否应该与命名空间匹配? 在我的一个团队项目中,我们有一个类库,项目中有许多子文件夹。 项目名称和命名空间: MyCompany.Project.Section 。 在这个项目中,有几个与命名空间部分匹配的文件夹: 文件夹Vehicles在MyCompany.Project.Section.Vehicles命名空间中有类 Folder Clothing在MyCompany.Project.Section.Clothing命名空间中有类等等。 在同一个项目中,是另一个流氓文件夹 文件夹BusinessObjects在MyCompany.Project.Section命名空间中有类 有一些像这样的文件夹是为了“组织方便”而制作的。 我的问题是:标准是什么? 在类库中,文件夹通常与命名空间结构匹配还是混合包? 回答1 另请注意,如果您使用内置模板将类添加到文件夹,则默认情况下它将被放置在反映文件夹层次结构的命名空间中。 这些课程将更容易找到,仅此一项就足够了。 我们遵循的规则是: 项目/程序集名称与根命名空间相同,但以 .dll 结尾上述规则的唯一例外是带有 .Core 结尾的项目,.Core 被剥离文件夹等于命名空间每个文件的一种类型(类、结构、枚举、委托等)可以轻松找到正确的文件 回答2 不。 我已经在小型和大型项目中尝试过这两种方法,包括单个(我
  • 按数据库拆分具有多个数据库的 mysqldump 文件(Split up a mysqldump file with multiple databases, by database)
    问题 我有一个包含多个数据库的 mysqldump 文件 (5)。 其中一个数据库需要很长时间才能加载,有没有办法按数据库拆分mysqldump文件,或者只是告诉mysql只加载一个指定的数据库? 马尼什 回答1 这个 Perl 脚本应该可以解决问题。 #!/usr/bin/perl -w # # splitmysqldump - split mysqldump file into per-database dump files. use strict; use warnings; my $dbfile; my $dbname = q{}; my $header = q{}; while (<>) { # Beginning of a new database section: # close currently open file and start a new one if (m/-- Current Database\: \`([-\w]+)\`/) { if (defined $dbfile && tell $dbfile != -1) { close $dbfile or die "Could not close file!" } $dbname = $1; open $dbfile, ">>", "$1_dump.sql" or die "Could not
  • 将 spark 数据帧的每一行写入一个单独的文件(Write each row of a spark dataframe as a separate file)
    问题 我有一个带有单列的 Spark Dataframe,其中每一行都是一个长字符串(实际上是一个 xml 文件)。 我想通过 DataFrame 并将每行中的一个字符串保存为文本文件,它们可以简单地称为 1.xml、2.xml 等。 我似乎找不到有关如何执行此操作的任何信息或示例。 我刚刚开始使用 Spark 和 PySpark。 也许在 DataFrame 上映射一个函数,但该函数必须将字符串写入文本文件,我找不到如何执行此操作。 回答1 使用 Spark 保存数据帧时,将为每个分区创建一个文件。 因此,获得每个文件一行的一种方法是首先将数据重新分区到与行数一样多的分区。 github 上有一个用于使用 Spark 读取和写入 XML 文件的库。 但是,数据帧需要具有特殊格式才能生成正确的 XML。 在这种情况下,由于您将所有内容都作为单个列中的字符串,最简单的保存方法可能是 csv。 可以按如下方式进行重新分区和保存: rows = df.count() df.repartition(rows).write.csv('save-dir') 回答2 我会在 Java 和 Hadoop FileSystem API 中这样做。 您可以使用 Python 编写类似的代码。 List<String> strings = Arrays.asList("file1", "file2",
  • 在每行一个标记的文件中反向换行标记化? - Unix(Reverse newline tokenization in one-token per line files? - Unix)
    问题 如何使用 Unix 在行中分隔令牌? 表明文件可以使用sed或xargs标记。 有没有办法做相反的事情? [在:] some sentences are like this. some sentences foo bar that [出去]: some sentences are like this. some sentences foo bar that 每个句子唯一的分隔符是\n\n 。 我本可以在 python 中完成以下操作,但是有 unix 方法吗? def per_section(it): """ Read a file and yield sections using empty line as delimiter """ section = [] for line in it: if line.strip('\n'): section.append(line) else: yield ''.join(section) section = [] # yield any remaining lines as a section too if section: yield ''.join(section) print ["".join(i).replace("\n"," ") for i in per_section(codecs.open('outfile.txt
  • 程序员应该在一个文件中放入多少个类?(How many classes should a programmer put in one file?)
    问题 在您的面向对象语言中,您遵循什么准则将类分组到单个文件中? 你总是给每个班一个单独的文件吗? 您是否将紧密耦合的类放在一起? 您是否曾经在一个文件中指定了接口的几个实现? 您是否根据实现可能有多少行代码或者它对类的用户来说看起来有多“混乱”来执行它? 还是用户更愿意将所有内容都放在一个地方? 回答1 就个人而言,我建议每个文件一个类,除非次要类是文件中主要类的私有类。 例如,C# 中的嵌套类将保留在父类文件中,但在其他地方可能有用的实用程序类会被分解到它们自己的文件甚至命名空间中。 关键是要了解您的环境以及人们会在哪里寻找事物。 如果有一个既定的方法论,在你打乱它之前仔细考虑。 如果您的同事期望相关的、紧密绑定的类将在单个文档中,则必须搜索它们可能会很烦人(尽管使用现代 IDE 应该不是问题)。 将内容分成更多文件而不是更少文件的另一个原因是版本控制。 如果你做一个小的改变,它应该尽可能只改变一个小文件。 如果您进行彻底的更改,很明显查看日志,因为所有受影响的文件(以及间接的类)都会被记录下来。 回答2 我认为我曾经使用过的所有面向对象语言的最佳实践是在一个文件中包含一个类。 我相信某些语言可能需要这样做,但我不确定这个事实。 但是我会说每个文件一个类,并且文件名与类名匹配(以及大多数情况下与包结构匹配的目录结构)是最佳实践。 回答3 1 个类 = 2 个文件。 一个 .h
  • Reverse newline tokenization in one-token per line files? - Unix
    How to separate tokens in line using Unix? showed that a file is tokenizable using sed or xargs. Is there a way to do the reverse? [in:] some sentences are like this. some sentences foo bar that [out]: some sentences are like this. some sentences foo bar that The only delimiter per sentence is the \n\n. I could have done the following in python, but is there a unix way? def per_section(it): """ Read a file and yield sections using empty line as delimiter """ section = [] for line in it: if line.strip('\n'): section.append(line) else: yield ''.join(section) section = [] # yield any remaining
  • Python嵌入(Python embedding)
    问题 我想要一个嵌入 Python 解释器和一个小脚本的大型二进制文件 - 我对整个静态链接、配置和制作以及 GCC 等都是全新的。 请问,有人可以向我描述构建此类可执行文件的基本步骤吗? 我在 MacOS 10.6 上,我下载了 Python 3.3 beta。 然后,我创建了“test.c”: #include <Python.h> int main(int argc, char *argv[]) { Py_Initialize(); PyRun_SimpleString("from time import time,ctime\n" "print('Today is', ctime(time()))\n"); Py_Finalize(); return 0; } 现在,在一个文件夹中,我有“Python-3.3.0b1”文件夹和“test.c”文件。 我输入: gcc -I ./Python-3.3.0b1 -o test test.c 但我有很多“包含”错误。 但我什至不确定这是否是正确的继续..? 我应该首先以某种方式构建 Python,然后将其与“test.c”“链接”吗? 顺便说一句,如果 Python 发布,他们是否使用相同的“./configure”和“make”过程? 他们是否使用了一些特殊选项,或者我是否能够构建与 python.org 提供的非常相似(相同
  • 为什么我们需要为每个类单独的“.swift”文件?(Why do we need separate ".swift" files for each class?)
    问题
  • 在单独的文件夹中编译python文件的方法?(Way to have compiled python files in a separate folder?)
    问题 是否可以让 Python 将.pyc文件保存到sys.path的单独文件夹位置? /code foo.py foo.pyc bar.py bar.pyc 到: /code foo.py bar.py /code_compiled foo.pyc bar.pyc 我喜欢这个,因为我觉得它会更有条理。 感谢你给与我的帮助。 回答1 更新: 在 Python 3.8 -X pycache_prefix=PATH命令行选项中,允许将.pyc文件写入以给定目录为根的并行树,而不是代码树。 请参阅 $PYTHONPYCACHEPREFIX envvar积分:@RobertT' 答案 缓存的位置在 sys.pycache_prefix 中报告( None表示__pycache__ [自 Python 3.2] 子目录中的默认位置)。 要关闭缓存已编译的 Python 字节码,可以设置-B ,然后 Python 不会尝试在导入源模块时编写.pyc文件。 请参阅 $PYTHONDONTWRITEBYTECODE envvar积分: @Maleev的回答 旧的 [Python 2] 答案: 有 PEP 304:控制字节码文件的生成。 它的状态是Withdrawn ,相应的补丁被拒绝。 因此,可能没有直接的方法来做到这一点。 如果您不需要源代码,那么您可以删除*.py文件。 *
  • Python的代码风格
    目录 一、设置代码格式 1、代码编写风格的重要性 2、设置格式指南 3、缩进 4、行长 5、空行 二、函数的编写风格 三、类的编码风格 一、设置代码格式 1、代码编写风格的重要性 随着你编写的程序越来越长,有必要了解一些代码格式设置约定。请花时间让你的代码尽可能易于阅读;让代码易于阅读有助于你掌握程序是做什么的,也可以帮助他人理解你编写的代码。为确保所有人编写的代码结构都大致一致。Python程序员都遵循一些格式设置约定。学会编写整洁的Python后,就能明白他人编写Python代码的整体结构------只要他们和你遵循相同的指南。 2、设置格式指南 若要提出Python语言修改建议,需要编写Python改进报案(Python Enchancement Proposal,PEP)。PEP8是最古老的PEP之一,它向Python程序员提供了代码格式设置指南。Python格式设置指南的编写者深知,代码被阅读的次数比编写的次数多。代码编写出来后,调试时你需要阅读它;给程序添加新功能时,需要花很长的时间阅读代码;与其他程序员分享代码,这些程序员也将阅读它们。如果一定要在让代码易于编写和易于阅读之间做出选择,Python程序员几乎总是会选择后者。 3、缩进 PEP 8建议每级缩进都使用四个空格,这既可提高可读性,又留下了足够的多级缩进空间。在字处理文档中,大家常常使用制表符而不是空格来缩进
  • PEP8 编码风格
    文章目录 PEP8 编码风格引言代码布局(Code Lay-Out)缩进(Indentation)每行最大长度(Maximum Line Length)二元运算符之前还是之后换行 ?(Should a line break before or after a binary operator?)空行(Blank Line)源文件编码 模块引用模块级的双下划线命名(Module level funder names)字符串引用(String Quotes)表达式和语句中的空格(Whitespace In Expressions And Statements)注释(Comments)块注释(Block Comments)文档字符串(Documentation Strings) 命名约定(Naming Conventions)首要原则(Overriding Principle)描述:命名风格(Descriptive: Naming Styles)规范:命名约定(Prescriptive: Naming Conventions)需要避免的命名(Names To Avoid)ASCII兼容性(ASCII Compatibility)包和模块命名(Package And Module Names)类命名(Class Names)类型变量命名(Type variable names)异常命名
  • 在 Python 中优化查找和替换大文件(Optimizing find and replace over large files in Python)
    问题 我是 Python 或任何严肃的编程语言的完整初学者。 我终于得到了一个可以工作的原型代码,但我认为它太慢了。 我的目标是根据我拥有的 csv 文件,在一个目录中的所有文件(它们是 csv)中使用整数查找和替换一些中文字符。 这些文件按年-月很好地编号,例如 2000-01.csv,并且将是该目录中唯一的文件。 我将遍历大约 25 个文件,每个文件大约 500mb(大约一百万行)。 我将使用的字典将有大约 300 个元素,我会将 unicode(汉字)更改为整数。 我尝试了一次测试运行,假设一切都呈线性增长(?),看起来它需要大约一周的时间才能运行。 提前致谢。 这是我的代码(不要笑!): # -*- coding: utf-8 -*- import os, codecs dir = "C:/Users/Roy/Desktop/test/" Dict = {'hello' : 'good', 'world' : 'bad'} for dirs, subdirs, files in os.walk(dir): for file in files: inFile = codecs.open(dir + file, "r", "utf-8") inFileStr = inFile.read() inFile.close() inFile = codecs.open(dir +
  • MySQL InnoDB 共享表空间和独立表空间
    前言:学习mysql的时候总是习惯性的和oracle数据库进行比较。在学习mysql InnoDB的存储结构的时候也免不了跟oracle进行比较。Oracle的数据存储有表空间、段、区、块、数据文件;mysql InnoDB的存储管理也类似,但是mysql增加了一个共享表空间和独立表空间的概念;一、概念共享表空间: Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。独立表空间:二、查看数据库的表空间mysql> show variables like 'innodb_data%';l 表空间有四个文件组成:ibdata1、ibdata2、ibdata3、ibdata4,每个文件的大小为10M,当每个文件都满了的时候,ibdata4会自动扩展;l 当前的存储空间满的时候,可以在其他的磁盘添加数据文件,语法如下:语法如下所示:pathtodatafile:sizespecification;pathtodatafile:sizespec;.;pathtodatafile:sizespec[
  • 保存到分区的镶木地板文件时实现并发(Achieve concurrency when saving to a partitioned parquet file)
    问题 使用partitionBy将dataframe写入parquet : df.write.partitionBy("col1","col2","col3").parquet(path) 我的期望是,正在写入的每个分区都由单独的任务独立完成,并且与分配给当前 spark 作业的工作人员数量并行。 然而,在写入镶木地板时,实际上一次只有一个工人/任务在运行。 那个工人正在循环遍历每个分区并连续写出.parquet文件。 为什么会这样 - 有没有办法在这个spark.write.parquet操作中强制并发? 以下不是我想看到的(应该是700%+ ..) 在另repartition文章中,我也尝试在前面添加repartition Spark parquet 分区:大量文件 df.repartition("col1","col2","col3").write.partitionBy("col1","col2","col3").parquet(path) 不幸的是,这没有效果:仍然只有一名工人.. 注意:我正在使用local[8]在local模式下运行,并且看到其他spark 操作与多达 8 个并发工作线程一起运行,并且使用了多达 750% 的 CPU。 回答1 简而言之,从单个任务写入多个输出文件不是并行化的,但假设您有多个任务(多个输入拆分),每个任务都将在一个 worker
  • MySQL InnoDB 共享表空间和独立表空间
    MySQL InnoDB 共享表空间和独立表空间 官网: https://dev.mysql.com/doc/refman/5.6/en/innodb-multiple-tablespaces.html 前言:学习mysql的时候总是习惯性的和oracle数据库进行比较。在学习mysql InnoDB的存储结构的时候也免不了跟oracle进行比较。Oracle的数据存储有表空间、段、区、块、数据文件;mysql InnoDB的存储管理也类似,但是mysql增加了一个共享表空间和独立表空间的概念; 一、概念 共享表空间: Innodb的所有数据保存在一个单独的表空间里面,而这个表空间可以由很多个文件组成,一个表可以跨多个文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。从Innodb的官方文档中可以看到,其表空间的最大限制为64TB,也就是说,Innodb的单表限制基本上也在64TB左右了,当然这个大小是包括这个表的所有索引等其他相关数据。 独立表空间: 二、查看数据库的表空间 mysql> show variables like 'innodb_data%'; l 表空间有四个文件组成:ibdata1、ibdata2、ibdata3、ibdata4,每个文件的大小为10M,当每个文件都满了的时候,ibdata4会自动扩展; l 当前的存储空间满的时候