diff --git a/changelog.txt b/changelog.txt
index ee46ffa0..e3dfe099 100644
--- a/changelog.txt
+++ b/changelog.txt
@@ -34,6 +34,7 @@ Fixed
 +++++
 
  - Attempting to create a linked view for a Project on Windows now raises an informative error message.
+ - Project configuration is initialized using ConfigObj, allowing the configuration to include commas and special characters (#251, #252).
 
 Deprecated
 ++++++++++
diff --git a/signac/contrib/project.py b/signac/contrib/project.py
index 96b7ce8f..c8804173 100644
--- a/signac/contrib/project.py
+++ b/signac/contrib/project.py
@@ -24,7 +24,7 @@ from ..core import json
 from ..core.jsondict import JSONDict
 from ..core.h5store import H5StoreManager
 from .collection import Collection
-from ..common.config import load_config, Config
+from ..common.config import get_config, load_config, Config
 from ..sync import sync_projects
 from .job import Job
 from .hashing import calc_id
@@ -1461,10 +1461,11 @@ class Project(object):
             fn_config = os.path.join(root, 'signac.rc')
             if make_dir:
                 _mkdir_p(os.path.dirname(fn_config))
-            with open(fn_config, 'a') as config_file:
-                config_file.write('project={}\n'.format(name))
-                if workspace is not None:
-                    config_file.write('workspace_dir={}\n'.format(workspace))
+            config = get_config(fn_config)
+            config['project'] = name
+            if workspace is not None:
+                config['workspace_dir'] = workspace
+            config.write()
             project = cls.get_project(root=root)
             assert project.get_id() == str(name)
             return project

diff --git a/tests/test_project.py b/tests/test_project.py
index e34b1b24..2870e2d7 100644
--- a/tests/test_project.py
+++ b/tests/test_project.py
@@ -9,6 +9,7 @@ import logging
 import itertools
 import json
 import pickle
+import string
 from tarfile import TarFile
 from zipfile import ZipFile
 from tempfile import TemporaryDirectory
@@ -1794,6 +1795,14 @@ class ProjectInitTest(unittest.TestCase):
         self.assertEqual(project.workspace(), os.path.join(root, 'workspace'))
         self.assertEqual(project.root_directory(), root)
 
+    def test_get_project_all_printable_characters(self):
+        root = self._tmp_dir.name
+        with self.assertRaises(LookupError):
+            signac.get_project(root=root)
+        project_name = 'testproject' + string.printable
+        project = signac.init_project(name=project_name, root=root)
+        self.assertEqual(project.get_id(), project_name)
+
     def test_get_project_non_local(self):
         root = self._tmp_dir.name
         subdir = os.path.join(root, 'subdir')

Commas in project names cause unexpected errors
### Description

I was creating a signac project named `oP6-As2(Co,Ni,Fe)_r`. This is problematic because the commas are not understood by the configuration parser.

### To reproduce

```python
>>> import signac
>>> signac.init_project('oP6-As2(Co,Ni,Fe)_r')
Traceback (most recent call last):
  File ".../signac/contrib/project.py", line 1462, in init_project
    project = cls.get_project(root=root, search=False)
  File ".../signac/contrib/project.py", line 1509, in get_project
    "Unable to determine project id for path '{}'.".format(os.path.abspath(root)))
LookupError: Unable to determine project id for path '/tmp_signac'.

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".../signac/contrib/project.py", line 1867, in init_project
    return Project.init_project(name=name, root=root, workspace=workspace, make_dir=make_dir)
  File ".../signac/contrib/project.py", line 1472, in init_project
    assert project.get_id() == str(name)
AssertionError
```
or
```bash
$ signac init "oP6-As2(Co,Ni,Fe)_r"
Error:
```

In both cases, a file `signac.rc` is created with the contents:
```ini
project=oP6-As2(Co,Ni,Fe)_r
```

The project name is misinterpreted as a list:
```python
>>> project.get_id()
"['oP6-As2(Co', 'Ni', 'Fe)_r']"
```

### System configuration
 - Operating System: macOS
 - Version of Python: 3.7.3
 - Version of signac [e.g. 1.0]: 1.2.0 (running on latest `master`)
tests/test_project.py::ProjectInitTest::test_get_project_all_printable_characters
tests/test_project.py::ProjectTest::test_config_modification tests/test_project.py::ProjectTest::test_corrupted_statepoint_file tests/test_project.py::ProjectTest::test_custom_job_class tests/test_project.py::ProjectTest::test_custom_project tests/test_project.py::ProjectTest::test_doc tests/test_project.py::ProjectTest::test_document tests/test_project.py::ProjectTest::test_find_job_ids tests/test_project.py::ProjectTest::test_find_jobs tests/test_project.py::ProjectTest::test_find_jobs_arithmetic_operators tests/test_project.py::ProjectTest::test_find_jobs_logical_operators tests/test_project.py::ProjectTest::test_find_jobs_next tests/test_project.py::ProjectTest::test_fn tests/test_project.py::ProjectTest::test_get tests/test_project.py::ProjectTest::test_get_id tests/test_project.py::ProjectTest::test_index tests/test_project.py::ProjectTest::test_isfile tests/test_project.py::ProjectTest::test_iteration tests/test_project.py::ProjectTest::test_job_clone tests/test_project.py::ProjectTest::test_job_move tests/test_project.py::ProjectTest::test_jobs_groupby tests/test_project.py::ProjectTest::test_jobs_groupbydoc tests/test_project.py::ProjectTest::test_len_find_jobs tests/test_project.py::ProjectTest::test_missing_statepoint_file tests/test_project.py::ProjectTest::test_num_jobs tests/test_project.py::ProjectTest::test_open_job_by_abbreviated_id tests/test_project.py::ProjectTest::test_open_job_by_id tests/test_project.py::ProjectTest::test_project_contains tests/test_project.py::ProjectTest::test_rename_workspace tests/test_project.py::ProjectTest::test_repair_corrupted_workspace tests/test_project.py::ProjectTest::test_repr tests/test_project.py::ProjectTest::test_root_directory tests/test_project.py::ProjectTest::test_schema tests/test_project.py::ProjectTest::test_schema_difference tests/test_project.py::ProjectTest::test_schema_eval tests/test_project.py::ProjectTest::test_schema_init tests/test_project.py::ProjectTest::test_schema_subset tests/test_project.py::ProjectTest::test_signac_project_crawler tests/test_project.py::ProjectTest::test_str tests/test_project.py::ProjectTest::test_temp_project tests/test_project.py::ProjectTest::test_workspace_broken_link_error_on_find tests/test_project.py::ProjectTest::test_workspace_directory tests/test_project.py::ProjectTest::test_workspace_directory_with_env_variable tests/test_project.py::ProjectTest::test_workspace_path_normalization tests/test_project.py::ProjectTest::test_workspace_read_only_path tests/test_project.py::ProjectTest::test_write_read_statepoint tests/test_project.py::ProjectExportImportTest::test_export tests/test_project.py::ProjectExportImportTest::test_export_custom_path_function tests/test_project.py::ProjectExportImportTest::test_export_custom_path_function_move tests/test_project.py::ProjectExportImportTest::test_export_custom_path_string tests/test_project.py::ProjectExportImportTest::test_export_custom_path_string_modify_flat_flat tests/test_project.py::ProjectExportImportTest::test_export_custom_path_string_modify_flat_tree tests/test_project.py::ProjectExportImportTest::test_export_custom_path_string_modify_tree_flat tests/test_project.py::ProjectExportImportTest::test_export_custom_path_string_modify_tree_tree tests/test_project.py::ProjectExportImportTest::test_export_import tests/test_project.py::ProjectExportImportTest::test_export_import_complex_path tests/test_project.py::ProjectExportImportTest::test_export_import_complex_path_nested_schema_from_path tests/test_project.py::ProjectExportImportTest::test_export_import_conflict tests/test_project.py::ProjectExportImportTest::test_export_import_conflict_synced tests/test_project.py::ProjectExportImportTest::test_export_import_conflict_synced_with_args tests/test_project.py::ProjectExportImportTest::test_export_import_schema_callable tests/test_project.py::ProjectExportImportTest::test_export_import_schema_callable_non_unique tests/test_project.py::ProjectExportImportTest::test_export_import_simple_path tests/test_project.py::ProjectExportImportTest::test_export_import_simple_path_nested_with_schema tests/test_project.py::ProjectExportImportTest::test_export_import_simple_path_schema_from_path tests/test_project.py::ProjectExportImportTest::test_export_import_simple_path_schema_from_path_float tests/test_project.py::ProjectExportImportTest::test_export_import_simple_path_with_float tests/test_project.py::ProjectExportImportTest::test_export_import_tarfile tests/test_project.py::ProjectExportImportTest::test_export_import_tarfile_zipped tests/test_project.py::ProjectExportImportTest::test_export_import_zipfile tests/test_project.py::ProjectExportImportTest::test_export_move tests/test_project.py::ProjectExportImportTest::test_export_single_job tests/test_project.py::ProjectExportImportTest::test_import_own_project tests/test_project.py::LinkedViewProjectTest::test_create_linked_view tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_heterogeneous_disjoint_schema tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_heterogeneous_disjoint_schema_nested tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_heterogeneous_fizz_schema_flat tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_heterogeneous_schema_nested tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_heterogeneous_schema_nested_partial_homogenous_path_provide tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_heterogeneous_schema_problematic tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_homogeneous_schema_flat_flat tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_homogeneous_schema_flat_tree tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_homogeneous_schema_nested tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_homogeneous_schema_nested_provide_partial_path tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_homogeneous_schema_tree tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_homogeneous_schema_tree_flat tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_homogeneous_schema_tree_tree tests/test_project.py::LinkedViewProjectTest::test_create_linked_view_with_slash_raises_error tests/test_project.py::CachedProjectTest::test_config_modification tests/test_project.py::CachedProjectTest::test_corrupted_statepoint_file tests/test_project.py::CachedProjectTest::test_custom_job_class tests/test_project.py::CachedProjectTest::test_custom_project tests/test_project.py::CachedProjectTest::test_doc tests/test_project.py::CachedProjectTest::test_document tests/test_project.py::CachedProjectTest::test_find_job_ids tests/test_project.py::CachedProjectTest::test_find_jobs tests/test_project.py::CachedProjectTest::test_find_jobs_arithmetic_operators tests/test_project.py::CachedProjectTest::test_find_jobs_logical_operators tests/test_project.py::CachedProjectTest::test_find_jobs_next tests/test_project.py::CachedProjectTest::test_fn tests/test_project.py::CachedProjectTest::test_get tests/test_project.py::CachedProjectTest::test_get_id tests/test_project.py::CachedProjectTest::test_index tests/test_project.py::CachedProjectTest::test_isfile tests/test_project.py::CachedProjectTest::test_iteration tests/test_project.py::CachedProjectTest::test_job_clone tests/test_project.py::CachedProjectTest::test_job_move tests/test_project.py::CachedProjectTest::test_jobs_groupby tests/test_project.py::CachedProjectTest::test_jobs_groupbydoc tests/test_project.py::CachedProjectTest::test_len_find_jobs tests/test_project.py::CachedProjectTest::test_missing_statepoint_file tests/test_project.py::CachedProjectTest::test_num_jobs tests/test_project.py::CachedProjectTest::test_open_job_by_abbreviated_id tests/test_project.py::CachedProjectTest::test_open_job_by_id tests/test_project.py::CachedProjectTest::test_project_contains tests/test_project.py::CachedProjectTest::test_rename_workspace tests/test_project.py::CachedProjectTest::test_repair_corrupted_workspace tests/test_project.py::CachedProjectTest::test_repr tests/test_project.py::CachedProjectTest::test_root_directory tests/test_project.py::CachedProjectTest::test_schema tests/test_project.py::CachedProjectTest::test_schema_difference tests/test_project.py::CachedProjectTest::test_schema_eval tests/test_project.py::CachedProjectTest::test_schema_init tests/test_project.py::CachedProjectTest::test_schema_subset tests/test_project.py::CachedProjectTest::test_signac_project_crawler tests/test_project.py::CachedProjectTest::test_str tests/test_project.py::CachedProjectTest::test_temp_project tests/test_project.py::CachedProjectTest::test_workspace_broken_link_error_on_find tests/test_project.py::CachedProjectTest::test_workspace_directory tests/test_project.py::CachedProjectTest::test_workspace_directory_with_env_variable tests/test_project.py::CachedProjectTest::test_workspace_path_normalization tests/test_project.py::CachedProjectTest::test_workspace_read_only_path tests/test_project.py::CachedProjectTest::test_write_read_statepoint tests/test_project.py::ProjectInitTest::test_get_job_invalid_workspace tests/test_project.py::ProjectInitTest::test_get_job_nested_project tests/test_project.py::ProjectInitTest::test_get_job_nested_project_subdir tests/test_project.py::ProjectInitTest::test_get_job_subdir tests/test_project.py::ProjectInitTest::test_get_job_symlink_other_project tests/test_project.py::ProjectInitTest::test_get_job_valid_workspace tests/test_project.py::ProjectInitTest::test_get_project tests/test_project.py::ProjectInitTest::test_get_project_non_local tests/test_project.py::ProjectInitTest::test_init tests/test_project.py::ProjectInitTest::test_nested_project tests/test_project.py::ProjectPicklingTest::test_pickle_jobs_directly tests/test_project.py::ProjectPicklingTest::test_pickle_project_empty tests/test_project.py::ProjectPicklingTest::test_pickle_project_with_jobs tests/test_project.py::TestTestingProjectInitialization::test_input_args